这题跟上一个题是一样的。就出所有最小生成树的所有边的值就可以了。
直接代码吧。
1 #include <stdio.h> 2 #include <algorithm> 3 #include <iostream> 4 #include <string.h> 5 #define MAXN 10000 6 #define MAXM 50000 7 using namespace std; 8 int point[500+10][500+10]; 9 struct edge 10 { 11 int u,v,w; 12 } edges[MAXM]; 13 int parent[MAXN]; 14 int n,m; 15 int i,j; 16 int maxx; 17 18 //并查集 19 void UFset() 20 { 21 22 for(i=1; i<=n; i++) 23 parent[i]=-1; 24 } 25 int Find(int x) 26 { 27 int s; 28 for(s=x; parent[s]>=0; s=parent[s]) ; 29 while(s!=x) 30 { 31 int tmp=parent[x]; 32 parent[x]=s; 33 x=tmp; 34 } 35 return s; 36 } 37 void Union(int R1,int R2) 38 { 39 int r1=Find(R1),r2=Find(R2); 40 int tmp=parent[r1]+parent[r2]; 41 if(parent[r1]>parent[r2]) 42 { 43 parent[r1]=r2; 44 parent[r2]=tmp; 45 } 46 else 47 { 48 parent[r2]=r1; 49 parent[r1]=tmp; 50 } 51 return; 52 } 53 //并查集 54 bool cmp(edge a,edge b) 55 { 56 return a.w<b.w; 57 } 58 void Kruskal() 59 { 60 maxx=0; 61 int sumweight=0; 62 int num=0; 63 int u,v; 64 UFset(); 65 for(i=0; i<m; ++i) 66 { 67 u=edges[i].u; 68 v=edges[i].v; 69 if(Find(u)!=Find(v)) 70 { 71 if(edges[i].w>maxx) maxx=edges[i].w; 72 sumweight+=edges[i].w; 73 ++num; 74 Union(u,v); 75 } 76 } 77 printf("%d\n",sumweight); 78 } 79 80 int main() 81 { 82 int t,count; 83 while(scanf("%d",&n)!=EOF) 84 { 85 memset(point,0,sizeof(point)); 86 87 88 89 for(i=0; i<n; ++i) 90 for(j=0; j<n; ++j) 91 { 92 scanf("%d",&point[i][j]); 93 if(point[i][j]==0) point[i][j]=1000000000; 94 } 95 m=0; 96 for(i=0; i<n; ++i) 97 for(j=0; j<=i; ++j) 98 { 99 if(i==j) continue; 100 edges[m].u=i+1; 101 edges[m].v=j+1; 102 edges[m].w=point[i][j]; 103 m++; 104 } 105 sort(edges,edges+m,cmp); 106 Kruskal(); 107 108 } 109 return 0; 110 }