某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
当N为0时,输入结束,该用例不被处理。
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
#include<cstdio>
#include<algorithm>
using namespace std;
struct node{
int s,t,len;
}nn[10010];
int par[110];
int m;
void init(){
for(int i=1;i<=100;i++){
par[i]=i;
}
}
bool cmp(node n1,node n2){
return n1.len<n2.len;
}
int find(int a){
if(a!=par[a]){
return par[a]=find(par[a]);
}
return a;
}
void unite(int a,int b){
int fa=find(a);
int fb=find(b);
if(fa!=fb)
par[fa]=fb;
}
int main()
{
while(scanf("%d",&m)!=EOF){
if(m==0)break;
init();
int n=m*(m-1)/2;
for(int i=1;i<=n;i++){
int a,b,len;
scanf("%d%d%d",&a,&b,&len);
nn[i].s=a;
nn[i].t=b;
nn[i].len=len;
}
int money=0;
sort(nn+1,nn+1+n,cmp);
for(int i=1;i<=n;i++){
if(find(nn[i].s)!=find(nn[i].t)){
unite(nn[i].s,nn[i].t);
money+=nn[i].len;
}
}
printf("%d\n",money);
}
return 0;
}