http://acm.hdu.edu.cn/showproblem.php?pid=1233
題意:求最小的公路總長度。
思路:克魯斯卡爾
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define maxn 111
struct ln
{
int a,b,dis;
}path[maxn*maxn];
int set[maxn];
int cmp(const void *p,const void *q)
{
return (*(struct ln*)p).dis>(*(struct ln*)q).dis?1:-1;
}
int find(int x)
{
if(set[x]==x)
return x;
else
return (set[x]=find(set[x]));
}
void merge(int x,int y)
{
x=find(x);
y=find(y);
if(x<y)
set[y]=x;
else
set[x]=y;
}
int main()
{
int n,i,used[maxn],k;
while(scanf("%d",&n)&&n)
{
int minsum=0;
memset(used,0,sizeof(used));
for(i=1;i<=n;i++)
set[i]=i;
for(i=1;i<=n*(n-1)/2;i++)
scanf("%d %d %d",&path[i].a,&path[i].b,&path[i].dis);
qsort(path+1,n*(n-1)/2,sizeof(struct ln),cmp);
for(i=1,k=1;k<=n-1;i++)
{
if(!used[path[i].a])
used[path[i].a]=1;
if(!used[path[i].b])
used[path[i].b]=1;
if(find(path[i].a)!=find(path[i].b))
{
merge(path[i].a,path[i].b);
minsum+=path[i].dis;
k++;
}
}
printf("%d\n",minsum);
}
return 0;
}