# include <iostream>
# include <algorithm>
# include <string.h>
# include <cstdio>
using namespace std;
/*
思路: 由于n 个点 n(n-1)/2条边, 所有两边都相互连通, 所以可以用并查集, 首先要按距离排序;后用并查集
在合并集合的过程中 求距离和;
*/
int bin[105];
int ans;
struct p{
int a,b,c;
}w[5000];
bool cmp(const p&a,const p&b)
{
return a.c<b.c;
}
int find(int x)
{
return x==bin[x]?x:bin[x]=find(bin[x]);//路径压缩;
}
void merge(int i)
{
int x, y;
x=find(w[i].a);
y=find(w[i].b);
if(x!=y)
{
bin[x]=y; //合并
ans +=w[i].c;//求当前两点的距离加上;
}
}
int main()
{
int n,m,i,max;
while(scanf("%d",&n)!=EOF&&n)
{
max=0;
m=n*(n-1)/2;
for(i=1;i<=m;i++)
scanf("%d%d%d",&w[i].a,&w[i].b,&w[i].c);
sort(w+1,w+m+1,cmp);
for(i=1;i<=n;i++)
bin[i]=i;
ans = 0;
for(i=1;i<=m;i++)
{
merge(i);
}
printf("%d\n",ans);
}
return 0;
}
hdu 1233 还是畅通工程
最新推荐文章于 2019-05-11 10:48:35 发布