Problem Description
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。
当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.
Hint
Hint题解:会用并查集就可以AC 没有坑!!!!
1 /* 2 Time: 2017/8/8 3 Author: WTZPT 4 */ 5 #include<iostream> 6 #include<cstring> 7 #include<algorithm> 8 using namespace std; 9 int parent[105]; 10 11 struct node{ //定义一个结构体,方便数据收集 12 int a,b,s; //a,b是两个村庄的编号 s是两个村庄的距离 13 }caseii[5005]; 14 15 void init() //初始化parent数组 16 { 17 for(int i = 0; i < 105; i++) 18 parent[i] = i; 19 } 20 21 bool cmp(node a,node b) //定义sort排序方式 22 { 23 return a.s < b.s; 24 } 25 26 int find(int n) //找根值 27 { 28 if(parent[n] == n) 29 return n; 30 else 31 return find(parent[n]); 32 } 33 34 int merge(int a,int b) 35 { 36 a = find(a); 37 b = find(b); 38 if(a != b) 39 { 40 parent[b] = a; 41 return 1; 42 } 43 return 0; 44 } 45 46 int main() 47 { 48 int n; 49 while(cin>>n&&n) 50 { 51 init(); 52 int t = n*(n-1)/2; 53 for(int i =0; i < t;i++) 54 cin>>caseii[i].a>>caseii[i].b>>caseii[i].s; 55 sort(caseii,caseii+t,cmp); 56 int sum = 0; 57 for(int i = 0; i < t;i++) 58 { 59 int temp = merge(caseii[i].a,caseii[i].b); 60 if(temp) sum += caseii[i].s; 61 } 62 63 cout<<sum<<endl; 64 } 65 66 return 0; 67 }