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

MST:
简单的说就是给定一个连通的无向图,并给每一条边赋予权重 w(u,v) ,在其中找出一个边集 A ,使得 A 链接所有的顶点,并使得这些 V 和这个边集 A 一起构成一棵树 T=(V,A) ,并且边集权重最小。

书中描述了两种采用贪心策略的算法,简单地说就是设法找到一个切割 (S,VS) 中的轻量及边,加入到边集 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,VS) ,(集合 S A 中的边链接的顶点)中的一条轻量级边加入到 A 中。
用优先级队列维护边的权重当与 A 没有连边是权重设为为INF,个人认为实现较Kruskal 的算法繁琐。

你可能感兴趣的:(算法理论)