这题意思是,求出形成不成环的图路线权值之和的最小值(每两个城市路线有权值),就先用一个结构体,把每组中那两个城市,城市之间权值,存下来,用这个权值排序,按从小到大,连接每两个城市,形成一个没有环的图,最后输出这个和。据称这个算法叫kruskal算法,还很很好理解的。
#include<cstdio>
#include<algorithm>
using namespace std;
struct note
{
int a,b,c;
};
struct note city[5001];
int cmp(struct note x,struct note y)
{
return x.c<y.c;
}
int father[101],ok;
void init()
{
for(int i=0;i<101;i++)
father[i]=i;
}
int find_father(int x)
{
return x==father[x]?x:find_father(father[x]);
}
void merge_father(int x,int y)
{
int tx=find_father(x);
int ty=find_father(y);
if(tx==ty)
{
ok=0;
return;
}
else
father[ty]=tx;
}
int main()
{
int n;
while(~scanf("%d",&n)&&n)
{
init();
int sum=0;
for(int i=0;i<n*(n-1)/2;i++)
scanf("%d %d %d",&city[i].a,&city[i].b,&city[i].c);
sort(city,city+n*(n-1)/2,cmp);
for(int i=0;i<n*(n-1)/2;i++)
{
ok=1;
merge_father(city[i].a,city[i].b);
if(ok)
{
sum+=city[i].c;
}
}
printf("%d\n",sum);
}
}