Problem D

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangran1111/article/details/51830315
Problem Description
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。<br>
 

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

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

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 代码:
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int maxn = 101; struct Edge{     int begin;     int end;     int weight; }edges[maxn*maxn]; int father[maxn]; int find(int a){     if(a == father[a]){         return a;     }     return father[a] = find(father[a]); } int kruscal(int count){     int i;     for(i = 1 ; i < maxn ; ++i){         father[i] = i;     }     int sum = 0;     for(i = 1 ; i <= count ; ++i){         int fa = find(edges[i].begin);         int fb = find(edges[i].end);         if(fa != fb){             father[fa] = fb;             sum += edges[i].weight;         }     }     return sum; } bool cmp(Edge a,Edge b){     return a.weight < b.weight; } int main(){     int n;     while(scanf("%d",&n)!=EOF,n){         int m = (n-1)*n/2;         int cnt = 1;         int i;         for(i = 1 ; i <= m ; ++i){             scanf("%d%d%d",&edges[cnt].begin,&edges[cnt].end,&edges[cnt].weight);             cnt++;         }         cnt -= 1;         sort(edges+1,edges+1+cnt,cmp);         printf("%d\n",kruscal(cnt));     }     return 0; }

猜你喜欢

转载自blog.csdn.net/wangran1111/article/details/51830315