Time Limit : 4000/2000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 21 Accepted Submission(s) : 10
Problem Description
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。<br>
Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。<br>当N为0时,输入结束,该用例不被处理。<br>
Output
对每个测试用例,在1行里输出最小的公路总长度。<br>
Sample Input
31 2 11 3 22 3 441 2 11 3 41 4 12 3 32 4 23 4 50
Sample Output
35
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; int n,a[10005]; struct note { int x,y,z; }; int find(int x) { if(a[x]==x) return x; return a[x]=find(a[x]); } void uni(int x,int y) { x=find(x); y=find(y); if(x!=y) a[x]=y; } int cmp(note a,note b) { return a.z<b.z; } int main() { note ab[10005]; while(~scanf("%d",&n)) { if(!n) break; for(int i=0;i<=n;i++) { a[i]=i; } for(int i=0;i<(n-1)*n/2;i++) scanf("%d%d%d",&ab[i].x,&ab[i].y,&ab[i].z); sort(ab,ab+n*(n-1)/2,cmp); int sum=0; int count=0; for(int i=0;i<n*(n-1)/2;i++) { if(find(ab[i].x)!=find(ab[i].y)) { uni(ab[i].x,ab[i].y); sum+=ab[i].z; } } printf("%d\n",sum); } return 0; }