最小生成树之prim算法

1.问题

现有一张n个点m条边的加权无向图,向该图中取出一些边构成最小生成树(MST)。最小生成树就是用n个点n-1条边组成一个极小连通子图,要求该生成树上的边权之和最小。问这个无向图的最小生成树的权值为多少。

2.解析

prim算法的核心是贪心,始终维护这样一颗最小生成树,不断向其中加边。
大概步骤如下图:
在这里插入图片描述
该图为原图
在这里插入图片描述
此处设置起始点为1
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

上图中红色的边为最终的最小生成树。

3.设计

1.以某一个点开始,寻找当前该点可以访问的所有的边;
2.在已经寻找的边中发现最小边,这个边必须有一个点还没有访问过,将还没有访问的点加入我们的集合,记录添加的边;
3.寻找当前集合可以访问的所有边,重复2的过程,直到没有新的点可以加入;
4.此时由所有边构成的树即为最小生成树。

4.分析

Prim算法首先对要在最小生成树中添加n个点,所以最外层的循环从1到n,添加每个点时要更新数组d,并且找出距离最小的点,需要对每个点更新,所以prim算法的复杂度为O(V^2)。

5.源码

https://github.com/Geedhayb/Geed/blob/master/prim.cpp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值