最小合成樹,kruskal算法;
首先將x[i]=i;初始化。將價格按照升序排序。
假如1和2連接,那麼x[1]=2;x[2]=2;x[3]=3;x[4]=4;x[5]=5;
接着2和3連接,那麼x[1]=2;x[2]=3;x[3]=3;x[4]=4;x[5]=5;
如此類推………那麼x[1]=2;x[2]=3;x[3]=4;x[4]=4;x[5]=5;
for(k=num[i].s;x[k]!=k;k=x[k])
for(g=num[i].s;x[g]!=g;g=x[g])
if(k!=g) //代表起始點不在一個集合,加上cost。
#include<stdio.h>
#include <stdlib.h>
struct edge
{
int m;
int n;
int d;
} a[5010];
int cmp(const void *a,const void *b)//°′éyDòÅÅáD
{
return((struct edge*)a)->d - ((struct edge*)b)->d;
}
int main(void)
{
int n;
while(scanf("%d",&n)!=EOF&&n!=0)
{
int i,t,num,min,k,g,x[100];
t = n * ( n - 1 ) / 2;
for(i=1; i<=n; i++)
x[i]=i;
for(i=0; i<t; i++)
scanf("%d%d%d",&a[i].m,&a[i].n,&a[i].d);
qsort(a,t,sizeof(a[0]),cmp);
min=num=0;
for(i=0; i<t; i++)
{
for(k=a[i].m; x[k]!=k; k=x[k]);
// x[k]=x[x[k]];
for(g=a[i].n; x[g]!=g; g=x[g]);
// x[g]=x[x[g]];
if(k!=g)
{
x[g]=k;
min+=a[i].d;
}
}
printf("%d\n",min);
}
return 0;
}