【图论】最小生成树与Prim、Kruskal算法

求图的最小生成树的Prim、Kruscal算法,其实都是由最小生成树的性质推来的,掌握了该性质,便能较容易地推导出这两种算法。

最小生成树的性质

无向图G的顶点集为VVV,设UUUVVV的真子集,u∈Uu\in UuUv∈(V−U)v\in (V- U)v(VU),边u-v是连通UUU、的所有边中权重最小的一条,则边u-v一定在G的最小生成树(MST)中。
反证法证明:假设T是一个MST,边u-v不在该MST中,先把它加入到T,则出现包含该边的环;T中必存在另一条边u′−v′u^\prime-v^\primeuv,连接题中两个集合,删除它后,环消失,出现新的MST,并且比原MST的权重更小,矛盾。

Prim算法

思路就是任取一个顶点作为初始U,不断寻找连接两个子集的所有边中权重最小的一条,把此边在V−UV-UVU上的顶点移到UUU,重复这个操作,直至U包含全部顶点。

Kruscal算法

直接将所有边按权重排序,从小到大,每次尝试添加一条到MST,如果加入后没有产生环就加入该边,否则跳过。

松弛操作

两种算法都用了求最值问题的松弛操作思路,相似的例子,求K个已排序数组的最短公共区间,该区间包含每个数组至少一个元素,初始化选择各个数组首个元素组成集合的最小最大值,然后松弛,选择最小值所在数组向右取元素,更新区间。

#include <vector>
#include <utility>
#include <numeric>
#include <iostream>
#include 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值