http://ac.jobdu.com/problem.php?pid=1017

来源:互联网 发布:查士丁尼瘟疫 知乎 编辑:程序博客网 时间:2024/05/01 10:10
题目描述:
    某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
输入:

    测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
    当N为0时,输入结束,该用例不被处理。

输出:

    对每个测试用例,在1行里输出最小的公路总长度。

样例输入:
31 2 11 3 22 3 441 2 11 3 41 4 12 3 32 4 23 4 50
样例输出:
35

[cpp] view plaincopy
  1. #include<iostream>  
  2. #include<cstdio>  
  3. #include<memory.h>  
  4. #include<algorithm>  
  5. #include<cstring>  
  6. #include<cmath>  
  7. #include<cstdlib>  
  8. using namespace std;  
  9. #define MAX 0x7FFFFFFF  
  10. struct Node{  
  11.     int dis;  
  12.     int a,b;  
  13.     bool operator<(const Node & node)const{  
  14.         return dis < node.dis;  
  15.     }  
  16. };  
  17. Node nodes[11000];  
  18. int father[110];  
  19. int getfather(int i){  
  20.     if(father[i] == i)  
  21.         return i;  
  22.     else{  
  23.         father[i] = getfather(father[i]);  
  24.         return father[i];  
  25.     }  
  26. }  
  27. void merge(int i, int j){  
  28.     father[i] = j;  
  29. }  
  30. int main(){  
  31.   
  32.     //freopen("in.txt", "r", stdin);  
  33.   
  34.     int n;  
  35.     while(cin>>n, n){  
  36.   
  37.         int times = n*(n-1)/2;  
  38.         for(int i=0;i<times;++i){  
  39.             scanf("%d%d%d", &nodes[i].a, &nodes[i].b, &nodes[i].dis);  
  40.         }  
  41.   
  42.         for(int i=1;i<=n;++i)  
  43.             father[i] = i;  
  44.         sort(nodes, nodes+times);  
  45.         int sum = 0;  
  46.         for(int i=0;i<times;++i){  
  47.             int fa = getfather(nodes[i].a);  
  48.             int fb = getfather(nodes[i].b);  
  49.             if(fa!=fb){  
  50.                 sum += nodes[i].dis;  
  51.                 merge(fa, fb);//father merge  
  52.             }  
  53.         }  
  54.         printf("%d\n", sum);  
  55.   
  56.     }  
  57.   
  58.     //fclose(stdin);  
  59.     return 0;  
  60. }  
原创粉丝点击