简单最小生成树
#include<stdio.h>
#include<stdlib.h>
#define inf 0x3fffffff
int f[1010],n,map[1010][1010];
struct op
{
int x,y,w;
}p[10100];
int find(int a)
{
if(a!=f[a])
f[a]=find(f[a]);
return f[a];
}
int cmp(const void *a,const void *b)
{
struct op *c,*d;
c=(struct op *)a;
d=(struct op *)b;
return c->w-d->w;
}
int main()
{
int i,j,a,b,c,num,count,sum,m;
while(scanf("%d%d",&n,&m)!=-1)
{
num=0;
for(i=0;i<n;i++)
{
f[i]=i;
for(j=0;j<n;j++)
map[i][j]=inf;
}
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(map[a][b]>c)
{
map[a][b]=map[b][a]=c;
}
}
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
if(map[i][j]<inf)
{
p[num].x=i;
p[num].y=j;
p[num++].w=map[i][j];
}
qsort(p,num,sizeof(p[0]),cmp);
count=0;sum=0;
for(i=0;i<num;i++)
{
if(count==n-1)break;
a=find(p[i].x);
b=find(p[i].y);
if(a==b)continue;
f[b]=find(f[a]);
sum+=p[i].w;
count++;
}
if(count<n-1)
puts("impossible");
else printf("%d\n",sum);
printf("\n");
}
return 0;
}