分析:Kruskal算法思想:按照边的权值的顺序从小到大查看一遍,如果不产生环(重边也算在内),就把当前这条边加入到生成树中。
#include<stdio.h>
#include<algorithm>
using namespace std;
int per[110];
int n;
struct stu
{
int u,v,w;
}edge[10000];
int cmp(stu x,stu y)
{
return x.w<y.w;
}
void init()
{
for(int i=1;i<=110;i++)
per[i]=i;
}
int find(int x)
{
if(x==per[x])
return x;
else
return per[x]=find(per[x]);
}
bool join(int x,int y)
{
int fx=find(x),fy=find(y);
if(fx!=fy)//确定是否生成环
{
per[fy]=fx;
return true;
}
else
return false;
}
int main()
{
while(scanf("%d",&n),n)
{
int i,sum=0,m;
m=n*(n-1)/2;
init();
for(i=0;i<m;i++)//注意下标
scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);
sort(edge,edge+m,cmp);//注意下标
for(i=0;i<m;i++)
{
if(join(edge[i].u,edge[i].v))
sum+=edge[i].w;
}
printf("%d\n",sum);
}
return 0;
}