某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
Input测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。
Output对每个测试用例,在1行里输出最小的公路总长度。
Sample Input
3 1 2 1 1 3 2 2 3 4 4 1 2 1 1 3 4 1 4 1 2 3 3 2 4 2 3 4 5 0
Sample Output
3 5 Huge input, scanf is recommended.
1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 #include<algorithm> 5 #include<cmath> 6 #include<vector> 7 #include<queue> 8 const int maxn=105; 9 #define ms(x,n) memset(x,n,sizeof x); 10 const int inf=0x3f3f3f3f; 11 using namespace std; 12 int n,m; 13 int u,v,w,parent[maxn];//ranks[maxn]; 14 struct node 15 { 16 int u,v,w; 17 node(){u=0,v=0,w=inf;} 18 //node(int uu,int vv,int ww){u=uu,v=vv,w=ww;} 19 }edge[maxn*maxn]; 20 bool cmp(node a,node b) 21 { 22 return a.w<b.w; 23 } 24 int init(int n) 25 { 26 for(int i=1;i<=n;i++) 27 parent[i]=-1;//,ranks[i]=-1; 28 } 29 int finds(int x) 30 { 31 if(parent[x]<0) return x; 32 return parent[x]=finds(parent[x]); 33 } 34 void unions(int x,int y) 35 { 36 x=finds(x),y=finds(y); 37 if(x==y) return; 38 if(parent[x]<parent[y]) 39 { 40 parent[x]+=parent[y]; 41 parent[y]=x; 42 } 43 else 44 { 45 parent[y]+=parent[x]; 46 parent[x]=y; 47 } 48 } 49 int kruskal() 50 { 51 sort(edge+1,edge+m+1,cmp); 52 init(n); 53 int ans=0; 54 for(int i=1;i<=m;i++) 55 { 56 node a=edge[i]; 57 if(finds(a.u)!=finds(a.v)) 58 { 59 unions(a.u,a.v); 60 ans+=a.w; 61 } 62 } 63 return ans; 64 } 65 int main() 66 { 67 ios::sync_with_stdio(false); 68 cin.tie(0); 69 while(~scanf("%d",&n),n) 70 { 71 m=n*(n-1)/2; 72 for(int i=1;i<=m;i++) 73 edge[i]=node(); 74 for(int i=1;i<=m;i++) 75 { 76 scanf("%d%d%d",&edge[i].u,&edge[i].v,&w); 77 edge[i].w=min(edge[i].w,w); 78 } 79 printf("%d\n",kruskal()); 80 } 81 return 0; 82 }