求无向连通图的最小生成树(c语言版)

完整源码地址:[email protected]:hglspace/MinCostSpTree.git

图例:

                   

1 普里姆算法

/*

 普里姆算法:假设N={v,{E}}是连通图,TE是N上的最小生成树中边的集合,算法从U={u0}(u0属于V),TE={}开始,重复执行下述操作:

 在所有u属于U,v属于V-U的边<u0,v0>属于E中找一条代价最小的边(u0,v0)并入集合TE,直至U=V为止,此时TE中必有n-1条边,则T={V,{TE}}为N的最小生成树

 */

void MiniSpanTree_PRIM(structGraph g,structvert u){

    struct tmp closedge[MAX_VEX_NUM];

    int index=u.index,i,j;

    int minimum(structtmp closedge[]);

    for(j=0;j<g.vexnum;j++){ //初始化辅助数组,辅助数组是记录从U到V-U具有最小代价的边

        if(j!=index){

            closedge[j].lowcost=g.arcs[index][j].cost;

            closedge[j].vex=u;

        }

    }

    closedge[index].lowcost=0;//自己到自己的最小权值是0

    for(i=1;i<g.vexnum;i++){

        index=minimum(closedge);

        if(index<0){

            printf("此图不是连通图\n");

            exit(0);

        }

        printf("下一个顶点是:%c,权值是:%d\n",g.vexs[index].data,closedge[index].lowcost);

        closedge[index].lowcost=0;

        for(j=0;j<g.vexnum;j++){ //U中有增加了新顶点,比较closedge数组中的最小权值和该顶点到V-U其他顶点的权值

            if(g.arcs[index][j].cost<closedge[j].lowcost){

                closedge[j].lowcost=g.arcs[index][j].cost;

                closedge[j].vex=g.vexs[index];

            }

        }

    }

}


int minimum(structtmp closedge[]){ //求closedge数组中最小权值的边,返回V-U中的顶点位置

    int

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值