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