最小生成树(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 的算法繁琐。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值