# include <iostream>
# include <algorithm>
using namespace std;
int root[110] = {0};
typedef struct Node
{
int a;
int b;
int c;
}Node;
Node bian[5100];
bool comp(Node a,Node b)
{
return a.c<b.c;
}
int find(int a)
{
return root[a] == a?a : find(root[a]);
}
int main()
{
int n = 1;
int a,b,c;
int num = 0;
int sum;
int m = 0;
while(n!=0)
{
sum = 0;
num = 0;
scanf("%d",&n);
if(n == 0)
{
break;
}
m= n*(n-1)/2;
for(int i =1;i<=n;i++)
{
root[i] = i;
}
for(int i =1;i<=m;i++)
{
scanf("%d %d %d",&bian[i].a,&bian[i].b,&bian[i].c);
}
sort(bian+1,bian+1+m,comp);
for(int i =1;i<=m;i++)
{
if(find(bian[i].a) != find(bian[i].b))
{
sum+=bian[i].c;
root[find(bian[i].b)] = find(bian[i].a);
//root[bian[i].b] = find(bian[i].a) 如果这样写会加入多余边
//比如 a->c b->c a->b第三条边会被重复加入形成环路 如果是第一种写法
//判断第二条边的时候就会直接改变a的根节点 ,不会重复加入第三条边
}
}
printf("%d\n",sum);
}
}
hdu-1233最小生成树并查集求解
最新推荐文章于 2024-10-29 23:57:59 发布