求图的最小生成树的Prim、Kruscal算法,其实都是由最小生成树的性质推来的,掌握了该性质,便能较容易地推导出这两种算法。
最小生成树的性质
无向图G的顶点集为VVV,设UUU为VVV的真子集,u∈Uu\in Uu∈U,v∈(V−U)v\in (V- U)v∈(V−U),边u-v是连通UUU、的所有边中权重最小的一条,则边u-v一定在G的最小生成树(MST)中。
反证法证明:假设T是一个MST,边u-v不在该MST中,先把它加入到T,则出现包含该边的环;T中必存在另一条边u′−v′u^\prime-v^\primeu′−v′,连接题中两个集合,删除它后,环消失,出现新的MST,并且比原MST的权重更小,矛盾。
Prim算法
思路就是任取一个顶点作为初始U,不断寻找连接两个子集的所有边中权重最小的一条,把此边在V−UV-UV−U上的顶点移到UUU,重复这个操作,直至U包含全部顶点。
Kruscal算法
直接将所有边按权重排序,从小到大,每次尝试添加一条到MST,如果加入后没有产生环就加入该边,否则跳过。
松弛操作
两种算法都用了求最值问题的松弛操作思路,相似的例子,求K个已排序数组的最短公共区间,该区间包含每个数组至少一个元素,初始化选择各个数组首个元素组成集合的最小最大值,然后松弛,选择最小值所在数组向右取元素,更新区间。
#include <vector>
#include <utility>
#include <numeric>
#include <iostream>
#include

最低0.47元/天 解锁文章
1236

被折叠的 条评论
为什么被折叠?



