题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1233
题目思路:建设公路把村庄连接起来,求路的最小总长度。求最小生成树,方法就是Kruskal算法。。
AC代码:
#include<stdio.h>
#include<stdlib.h>
int f[105];
int find(int a)
{
if(f[a]!=a)
f[a]=find(f[a]);
return f[a];
}
struct hh
{
int a,b;
int w;
}road[5000];
int cmp(const void *a,const void *b)
{
return ( *(struct hh *)a).w - (*(struct hh *)b).w;
}
int main()
{
int i,n,j;
while(~scanf("%d",&n),n)
{
for(i=0;i<n*(n-1)/2;i++)
scanf("%d%d%d",&road[i].a,&road[i].b,&road[i].w);
for(i=0;i<100;i++)
f[i]=i;
qsort(road,n*(n-1)/2,sizeof(road[0]),cmp);
int fa,fb,ans=0;
for(j=0,i=0;i<n*(n-1)/2;i++)
{
fa=find(road[i].a);
fb=find(road[i].b);
if(fa!=fb)
{
ans+=road[i].w;
f[fa]=fb;
j++;
if(j>=n-1)break;
}
}
printf("%d\n",ans);
}
return 0;
}
AC截图: