使用并查集加使用克鲁斯卡尔算法,水体直接解;
#include<stdio.h>
#include<algorithm>
using namespace std;
int bin[5005];
struct In
{
int p1,p2;
int v;
}s[5005];
bool compare(In a,In b)
{
return a.v < b.v;
}
int findx(int x)
{
int r=x;
if(bin[r]!=r) bin[r]=findx(bin[r]);
return bin[r];
}
int merge(int a,int b)
{
int fx,fy;
fx=findx(a);
fy=findx(b);
if(fx==fy) return 1;
else {
if(fx<fy) bin[fx]=fy;
else bin[fy]=fx;
return 0;
}
}
int main()
{
int i,n,c1,c2,c3,c4,sum;
while(scanf("%d",&n)&&n!=0)
{
sum=0;
n=n*(n-1)/2;
for(i=0;i<5005;i++) bin[i]=i;
for(i=0;i<n;i++)
{
scanf("%d%d%d",&c1,&c2,&c3);
s[i].p1=c1;
s[i].p2=c2;
s[i].v=c3;
}
sort(s,s+n,compare);
for(i=0;i<n;i++)
{
if(merge(s[i].p1,s[i].p2)==0) sum+=s[i].v;
}
printf("%d\n",sum);
}
}