MST:
简单的说就是给定一个连通的无向图,并给每一条边赋予权重
w(u,v)
,在其中找出一个边集
A
,使得
书中描述了两种采用贪心策略的算法,简单地说就是设法找到一个切割 (S,V−S) 中的轻量及边,加入到边集 A 中。用通用伪代码描述就是
GENERIC-MST(G,w)
A=∅
while A does not form a spanning tree
find a edge (u,v) that is safe for A
A=A∪{(u,v)}
return A下面介绍两种找到安全边的算法,一种是Kruskal 的算法,另一种是Prim 的算法,两种算法的复杂度是差不多的。
Kruskal 算法
此算法中 A 是一个森林,而每次加入的边是链接两个不同分量的节点中权重最小的边。算法用一个并查集(DIsjiont Set) 维护不同的分量
伪代码
MST-KRUSKAL(G,w)
A=∅
init a Disjiont Set for all verteies
sort the edges of G.E into nondecreasing order by weight w
for each edge (u,v) ∈G.E ,taken in nondecreasing order by weight
if FIND-SET( u ) != FIND-SET(v )
A=A∪{(u,v)}
UNION(u,v)时间复杂度为 O(E lgE)
Prim 算法
Prim 算法的思想是, A 中的边构成的是一颗树,每次找切割
(S,V−S) ,(集合 S 为A 中的边链接的顶点)中的一条轻量级边加入到 A 中。
用优先级队列维护边的权重当与A 没有连边是权重设为为INF,个人认为实现较Kruskal 的算法繁琐。