Kruskal算法的实现

顶点为:A,B,C,D,E,F;

图请见:数据结构(严蔚敏版)

#include <stdio.h>
#define M 999  //M代表不可达
#define N 6

kruskal(){
    //初始化数据
    int edge[N][N]={{M,6,1,5,M,M},{6,M,5,M,3,M},
    {1,5,M,5,6,4},{5,M,5,M,M,2},{M,3,6,M,M,6},{M,M,4,2,6,M}};
    //初始状态TE={V,{ }};设置顶点所在的连通分量,边不在TE中
    int vflag[N]={1,2,3,4,5,6};
    int eflag[N][N]={0};
    int i,j;
    int count = 0;

    //从图中选取出N-1条边
    while(count<N-1){
        int min = 999;
        int m,n,index;
        m=-1;
        n=-1;
        index=-1;
        //从所有边中选取当前最短的边(u,v)
        for(i=0;i<N;i++)
            for(j=i+1;j<N;j++){
                if(edge[i][j]!=M&&eflag[i][j]!=1){
                    if(edge[i][j]<min){
                        min = edge[i][j];
                        m=i;
                        n=j;
                    }
                }
            }
        printf("最小值为:%d\n",min);//打印出从E边中找出的最短边
        eflag[m][n]=1;
        //判断(u,v)是不是属于同一个连通分量,如果不是则加入TE中,如果是,则不加入。
        if(vflag[m]!=vflag[n]){
            printf("将第%d条边加入T中,长度为:%d:%c->%c\n",(count+1),edge[m][n],(m+65),(n+65));
            count++;
       }
       //修改连通分量
       for(i=0;i<N;i++){
            //合并点m所在连通分量和点n所在的连通分量
            if(vflag[i]==vflag[m]||vflag[i]==vflag[n]){
                vflag[i]=vflag[m];
            }
       }
    }
}

int main(){
    kruskal();
    return 1;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值