其他分享
首页 > 其他分享> > acwing349 黑暗城堡 (最短路径生成树)

acwing349 黑暗城堡 (最短路径生成树)

作者:互联网

求出最短树,用乘法原理统计答案就行了(模拟prim过程)。

不知道说什么了,直接上代码:

 1 #include<cstring>
 2 #include<iostream>
 3 #include<algorithm>
 4 #define ll long long
 5 using namespace std;
 6 const int N=1006;
 7 const ll P=(1ll<<31)-1;
 8 int n,m,a[N][N],d[N];
 9 bool v[N];
10 
11 int main(){
12     cin>>n>>m;
13     memset(a,0x3f,sizeof(a));
14     for(int i=1;i<=n;i++) a[i][i]=0;
15     for(int i=1;i<=m;i++){
16         int x,y,z;
17         scanf("%d%d%d",&x,&y,&z);
18         a[x][y]=a[y][x]=min(a[x][y],z);
19     }
20     memset(d,0x3f,sizeof(d));
21     d[1]=0;
22     for(int i=1;i<n;i++){
23         int x=0;
24         for(int j=1;j<=n;j++)
25             if(!v[j]&&(x==0||d[j]<d[x])) x=j;
26         v[x]=1;
27         for(int j=1;j<=n;j++)
28             if(!v[j]) d[j]=min(d[j],d[x]+a[x][j]);
29     }
30     memset(v,0,sizeof(v));
31     v[1]=1;
32     ll ans=1;
33     for(int i=1;i<n;i++){
34         int x=0,k=0;
35         for(int j=2;j<=n;j++)
36             if(!v[j]&&(x==0||d[j]<d[x])) x=j;
37         for(int j=1;j<=n;j++)
38             if(v[j]&&d[j]+a[j][x]==d[x]) ++k;
39         v[x]=1;
40         (ans*=k)%=P;//乘法原理 
41     }
42     cout<<ans<<endl;
43     return 0;
44 }

 

标签:0x3f,acwing349,int,城堡,ll,long,最短,const,include
来源: https://www.cnblogs.com/yhxnoerror/p/16491427.html