思路:考虑的是并查集,还有贪心算法中的克鲁斯卡尔算法,考虑的时候要借助 贪心算法还有并查集,建立树的概念,通过寻找父节点,看是否是满足的父节点,然后进行一些列的判断求解。
#include<stdio.h>
#include<algorithm>
using namespace std;
struct dis
{
int a,b,c;
}s[10010];
int cmp(dis x,dis y)
{
return x.c<y.c;
}
int z[110];
int f(int y)
{
int r=y;
while(r!=z[r])
r=z[r];
return r;
}
int merge(int a,int b)
{
int fx=f(a);
int fy=f(b);
if(fx!=fy)
{
if(fx<fy) z[fy]=fx;
else z[fx]=fy;
return 1;
}
else return 0;
}
int main()
{
int t,i,n,sum,m;
while(!scanf("%d",&t),t)
{
n=t*(t-1)/2;
for(i=1;i<=t;i++)
z[i]=i;
for(int i=0;i<n;i++)
scanf("%d%d%d",&s[i].a,&s[i].b,&s[i].c);
sort(s,s+n,cmp);
m=1,sum=0;
for(i=0;i<n&&m<t;i++)
{
if(merge(s[i].a,s[i].b))
{
m++;
sum+=s[i].c;
}
}
printf("%d\n",sum);
}
return 0;
}