畅通工程
贪心最小生成树
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[10001];
struct st
{
int x,y,len;
}s[100001];
int find(int x)
{
while(a[x]!=x)
{
x=a[x];
}
return x;
}
int un(int x,int y)
{
x=find(x);
y=find(y);
if(x!=y)
{
a[x]=y;
return 1;
}
else
return 0;
}
int cmp(const void *a,const void *b)
{
st c=*(st *)a;
st d=*(st *)b;
return c.len-d.len;
}
int main()
{
int i,j,k,n,m,t,l,tt,t1,t2;
while(~scanf("%d",&n))
{
if(n==0)
break;
for(i=1;i<=10000;i++)
{
a[i]=i;
}
k=0;
for(i=0;i<n*(n-1)/2;i++)
{
scanf("%d %d %d",&s[i].x,&s[i].y,&s[i].len);
}
qsort(s,n*(n-1)/2,sizeof(s[0]),cmp);
int sum=0;
for(i=0;i<n*(n-1)/2;i++)
{
sum+=un(s[i].x,s[i].y)*s[i].len;
}
printf("%d\n",sum);
}
return 0;
}