还是畅通工程
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
输入描述:
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。
输出描述:
对每个测试用例,在1行里输出最小的公路总长度。
输入例子:
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
输出例子:
3
5
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 6 struct edge{ 7 int a,b,cost; 8 }road[5000]; 9 10 int f[5000],M,T,s; 11 12 inline int cmp(struct edge x ,struct edge y) 13 { 14 return x.cost<y.cost; 15 } 16 17 int finds(int x) 18 { 19 if(x!=f[x]) 20 f[x] = finds(f[x]); 21 return f[x]; 22 } 23 int krus() 24 { 25 int x,y,k=0; 26 for(int i=1;i<=T;i++){ 27 x = finds(road[i].a); 28 y = finds(road[i].b); 29 if(x!=y){ 30 s+=road[i].cost; 31 if(x>y) 32 f[x] = y; 33 else 34 f[y] = x; 35 } 36 } 37 return s; 38 } 39 40 int main() 41 { 42 while(cin>>M&&M){ 43 s = 0; 44 T = M*(M-1)/2; 45 for(int i=1;i<=T;i++){ 46 f[i] = i; 47 cin>>road[i].a>>road[i].b>>road[i].cost; 48 } 49 sort(road+1,road+T,cmp); 50 s = krus(); 51 cout<<s<<endl; 52 } 53 return 0; 54 }