您的位置:首页 > 其它

最小生成树(Minimal Spanning Tree MST)--《算法导论》

2016-08-25 19:16 1016 查看
MST:

简单的说就是给定一个连通的无向图,并给每一条边赋予权重w(u,v),在其中找出一个边集A,使得A链接所有的顶点,并使得这些V和这个边集A一起构成一棵树T=(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 的算法繁琐。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息