杭電1233

最小合成樹,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ò&#197;&#197;á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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章