//九度OJ教程71 kruskal求最小生成树。
//http://ac.jobdu.com/problem.php?cid=1040&pid=70
//Tip:先用qsort排序,然后顺序遍历直到完成。
#include <stdio.h>
#include <stdlib.h>
#define N 10000
typedef struct E{
int a,b;
int value;
}E;
int cmp(const void *a,const void *b)
{
E *aa=(E *)a,*bb=(E *)b;
return aa->value-bb->value;
}
int Tree[N]={0};
int findroot(int a)
{
if(!Tree[a])return a;
int temp=findroot(Tree[a]);
Tree[a]=temp;
return temp;
}
int main()
{
int i,j,m,n,a,b,sum;
E ss[N];
while(~scanf("%d",&n)&&n)
{
sum=0;
m=n*(n-1)/2;
for(i=0;i<N;i++)Tree[i]=0;
for(i=0;i<m;i++){scanf("%d %d %d",&ss[i].a,&ss[i].b,&ss[i].value);}
qsort(ss,m,sizeof(ss[0]),cmp);
for(i=0,j=1;j<n;i++)
{
a=findroot(ss[i].a);
b=findroot(ss[i].b);
if(a-b)
{
Tree[a]=b;
sum+=ss[i].value;
j++;
}
}
printf("%d\n",sum);
}
return 0;
}
//九度OJ教程71 kruskal求最小生成树。
最新推荐文章于 2017-05-28 13:21:05 发布