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<bits/stdc++.h>
using namespace std;
struct me
{
int a;
int b;
int l;
}road[1000001];
int p[10000],sum=0,m,n;
int cmp(me x, me y)
{
return x.l<y.l;
}
int find(int x)
{
if(p[x]==x) return x;
return p[x]=find(p[x]);
}
void merge(int x, int y, int z)
{
x=find(x);
y=find(y);
if(x!=y)
{
p[x]=y;
sum+=z;
}
}
int Kruskal()
{
for(int i=1;i<=n;i++)
p[i]=i;
sort(road+1,road+m+1,cmp);
for(int i=1;i<=m;i++)
merge(road[i].a,road[i].b,road[i].l);
}
int main()
{
while(scanf("%d", &n))
{
if(n==0)
break;
sum=0;
m=n*(n-1)/2;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&road[i].a,&road[i].b,&road[i].l);
}
Kruskal();
printf("%d\n",sum);
}
return 0;
}
利用Kruskal算法求最小生成树