http://acm.cs.ecnu.edu.cn/problem.php?problemid=2529
题意,求修造为通路耗费的最小精力。
即求无向图的最小生成树,此题注意结点是0到n 为n+1个,判断连通条件可以判断树的边数是不是为n,此题用prim
1 #include<map> 2 #include<cmath> 3 #include<cctype> 4 #include<cstdio> 5 #include<string> 6 #include<cstdlib> 7 #include<cstring> 8 #include<iostream> 9 #include<algorithm> 10 using namespace std; 11 const int inf=999999999; 12 int mat[105][105]; 13 int n; 14 void init(){ 15 for(int i=0;i<=n;i++) 16 for(int j=0;j<=n;j++) 17 mat[i][j]=inf; 18 } 19 int prim(){ //注意 ,都是从0-n 20 int lowcost[105],s[105]; 21 int ans=0,cnt=0; 22 for(int i=0;i<=n;i++){ 23 lowcost[i]=mat[0][i]; 24 s[i]=0; 25 } 26 s[0]=1; 27 for(int i=0;i<=n;i++){ 28 int min=inf,k; 29 for(int j=0;j<=n;j++) 30 if(!s[j] && lowcost[j]<min){ 31 min=lowcost[j]; 32 k=j; 33 } 34 if(min==inf) break; 35 ans+=min; 36 cnt++; 37 s[k]=1; 38 for(int j=0;j<=n;j++) 39 if(!s[j] && mat[k][j]<lowcost[j]) 40 lowcost[j]=mat[k][j]; 41 } 42 if(cnt==n) //判断是否连通 43 return ans; 44 else return 0; 45 } 46 int main(){ 47 int t; 48 cin>>t; 49 while(t--){ 50 int m; 51 scanf("%d%d",&n,&m); 52 init(); 53 while(m--){ 54 int a,b,c; 55 scanf("%d%d%d",&a,&b,&c); 56 if(c<mat[a][b]) 57 mat[a][b]=mat[b][a]=c; //注意是无向 58 } 59 /*for(int i=0;i<=n;i++){ 60 for(int j=0;j<=n;j++) 61 printf("%d ",mat[i][j]); 62 cout<<endl; 63 }*/ 64 int ans=prim(); 65 if(ans)printf("%d\n",ans); 66 else printf("-1\n"); 67 } 68 return 0; 69 }