kruscal最小树

来源:互联网 发布:淘宝店铺导航修改首页 编辑:程序博客网 时间:2024/04/30 11:50

和我一开始想的一样,连了线的点做相同的标记,直到所有的点标记相同

#include <iostream>

using namespacestd;

#define imax 1005

int n,a[28][28];

struct list

{

    int u,v,w;

}e[imax];

int cmp(list a,list b)

{

    return a.w<b.w;

}

void kruscal(int sum)

{

    int vis[imax];

    for(int i=1;i<=n;i++)

        vis[i]=i;

    int k=1,j=0;

    //排序

    sort(e,e+sum,cmp);

    while(k<n)

    {

        int t1=vis[e[j].u];

        int t2=vis[e[j].v];

        if(vis[e[j].u]!=vis[e[j].v])

        {

            printf("%d->%d,%d\n",e[j].u,e[j].v,e[j].w);

            k++;

            for(int i=1;i<=n;i++)

            {

                if(vis[i]==t2)

                    vis[i]=t1;

            }

        }

        j++;

    }

}

int main()

{

    int i,j,k,cost;

    char ch;

    while(scanf("%d",&n),n!=0)

    {

        getchar();

        for(i=1;i<=n;i++)

            for(j=1;j<=n;j++)

                a[i][j]=imax;

        for(i=1;i<n;i++)

        {

            scanf("%c %d",&ch,&k);

            getchar();

            while(k--)

            {

                scanf("%c %d",&ch,&cost);

                getchar();

                j=ch-'A'+1;

                a[i][j]=cost;

            }

        }/*

          for(int i=1;i<=n;i++)

          {

          for(int j=1;j<=n;j++)

          printf("%4d ",a[i][j]);

          printf("\n");

          }*/

        k=0;

        for(i=1;i<=n;i++)

        {

            for(j=1;j<=n;j++)

            {

                if(a[i][j]!=imax)

                {

                    e[k].u=i;//起点

                    e[k].v=j;//末点

                    e[k].w=a[i][j];//

                    k++;

                }

            }

        }

        kruscal(k);

       // printf("%d\n",result);

        

        

    }

    //cout << "Hello, World!\n";

    return0;

}

/*

9

A 2 B 12 I 25

B 3 C 10 H 40 I 8

C 2 D 18 G 55

D 1 E 44

E 2 F 60 G 38

F 0

G 1 H 35

H 1 I 35

*/



0 0
原创粉丝点击