最小生成树(MST)

本文介绍了两种求解无向图最小生成树的方法:Prim算法和Kruskal算法。Prim算法从一个点开始,逐步寻找与当前集合最小相连的边,直至包含所有顶点。Kruskal算法则是找到所有最小边,通过维护集合避免形成环路。文章详细阐述了两种算法的原理,并提供了代码实现的思路。
摘要由CSDN通过智能技术生成

最小生成树(MST)

  • 连通n个城市,至少需要n-1条边,若是无向图,则连接n个城市,最多可以设置n(n-1)/2条线路,求如何求得n-1条路使花费最少
  • 有两种算法实现:Prim算法和Kruskal算法

一.Prim算法

1.说明

  • 从一个点开始找,找到与其相邻的最小的边,将点并入与第一个点的集合,将他们作为集合寻找最小的点,直到所有顶点被加入集合,就找到最小花费的路
  • 设置lowcost[i],i表示边的终点,当lowcost[i]=0时,说明以i为终点的边并入到了MST中
  • 设置mst[i]:表示对应lowcost[i]的起点,即边<mst[i],i>是MST的一条边,当mst[i]=0表示起点i加入到了MST中
  • 将没有边的点改为无穷大

2.代码实现

2.1存储图结构:初始化
  • 在初始化边的数值时将他们不再赋值为0,而改为最大值
  • 无穷大的数值可以用一个字符来表示,而当edges[i][j]中i和j相等时,我们将其初始化为0
//利用邻接矩阵存储实现
#define MAX_COST 0x7FFFFFFF//在初始化边的数值时将他们不再赋值为0,而改为最大值
//无穷大的数值可以用一个字符来表示,而当edges[i][j]中i和j相等时,我们将其初始化为0
2.2求解最小生成树
void minSpanTree_Prim(Graph *g,char T)
{
   
    //设置lowcost[]
    int* lowcost=(int*)malloc(sizeof(int)*g->numv);
    int *mst=(int*)malloc(sizeof(int)*g->numv);
    //利用第一个输入的点T将其初始化
    int k=getvpos(T);//得到点在数组中存储的位置
    for(int i=0;i<g->numv;i++)
    {
   
        if(i==k)//对自身初始化
        {
   
            lowcost[i]=0;
            mst[i]=0;//将其并入MST
        }
        else
        {
   
            lowcost[i]=getweight(g,i,k);//得到i
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值