算法导论(二)最小生成树

最小生成树的形成

管理一个遵循下属循环不变式的集合A:
在每遍循环前,A是某棵最小生成树的边的子集
在每一步,选择一条边(u,v)加入A,使得A仍然是某棵最小生成树的边集的子集,这样的一边成为安全边。

GENERIC-MST(G,w)
A = ϕ \phi ϕ
while A 还没有形成一颗最小生成树
 寻找一条A的安全边(u,v)
 A = A ∪ { ( u . v ) } A \cup\{(u.v)\} A{(u.v)}
return A
该算法会运行 ∣ V ∣ − 1 |V|-1 V1

安全边

A ⊆ M S T T A ∪ { ( u , v ) } ⊆ M S T T ′ ( u , v ) 对 A 是 安 全 的 A\subseteq MST\quad T \\ A\cup \{(u,v)\}\subseteq MST \quad T'\\ (u,v)对A是安全的 AMSTTA{(u,v)}MSTT(u,v)A

几个定义:

  • 割:集合的划分 割(X,Y), X ∪ Y = V , X ∩ Y = ϕ , X ≠ ϕ , Y ≠ ϕ X\cup Y = V,X\cap Y = \phi,X\neq\phi,Y\neq \phi XY=V,XY=ϕ,X=ϕ,Y=ϕ
  • (u,v)穿过割 u ∈ X , v ∈ Y u\in X,v\in Y uX,vY
  • 割尊敬集合A:集合A中不存在横跨割的边
  • 穿过割的轻边:在所有横跨割的边中,权重最小的边

辨认安全边的定理:
定理 23.1
设G = (V,E)是一个在边E上定义了实值权重函数w的连通无向图。设集合A为E的一个子集且A包括在图G的某刻最小生成树中,设(S,V-S)是图中某一尊敬A的任意切割,又设(u,v)是横跨切割(S,V-S)一条轻边。那么边(u,v)对A是安全的
A ⊆ M S T T c u t ( X , Y ) 尊 敬 A ( u , v ) 是 穿 过 c u t ( X , Y ) 的 轻 边 ( u , v ) 对 A 是 安 全 的 A\subseteq MST\quad T \\ cut(X,Y)尊敬A\\ (u,v)是穿过cut(X,Y)的轻边\\ (u,v)对A是安全的 AMSTTcut(X,Y)Auv穿cutX,Y(u,v)A
证明:
1、若这条边(u,v)是属于T的,则(u,v)对A是安全的
2、若(u,v)不属于T:
在T中存在u到v的简单路,T + {(u,v)}构成环,在该环上至少存在边(x,y), x ∈ X , y ∈ Y x\in X,y\in Y xX,yY,
T’ = T + {(u,v)} - {(x,y)}是生成树
w ( T ′ ) = w ( T ) + w ( u , v ) − w ( x , y ) ≤ w ( T ) w ( T ′ ) = w ( T ) w(T') = w(T) + w(u,v) - w(x,y) \leq w(T)\\w(T') = w(T) w(T)=w(T)+w(u,v)w(x,y)w(T)w(T)=w(T)
T’是MST
由于割尊敬A,(x,y)穿过割, ( u , v ) ∉ A , A ⊆ T − { ( x , y ) } A ⊆ T ′ , A ∪ ( u , v ) ⊆ T ′ 由 于 T ′ 是 最 小 生 成 树 , ( u , v ) 对 集 合 A 是 安 全 的 (u,v)\notin A,A\subseteq T-\{(x,y)\}\\ A\subseteq T',A\cup(u,v)\subseteq T'\\ 由于T' 是最小生成树,(u,v)对集合A是安全的 (u,v)/A,AT{(x,y)}AT,A(u,v)TT(u,v)A

推论 23.2:
设G = (V,E)是一个连通无向图,并有定义在边集合E上的实数权值函数w。设集合A为E的一个子集,且该自己包括在G的某刻最小生成树中,并设 C = ( V C , E C ) C = (V_C,E_C) C=(VC,EC)为森林 G A = ( V , A ) G_A= (V,A) GA=(V,A)的一个连通分量。如果边(u,v)是连接C和 C A C_A CA中某个其他来南通分量的一条轻边,则(u,v)对A是安全的。
证明太显然了,用定理23.1,这条推论是下述两个算法的基础。

Kruskal 算法

在所有链接森林中两棵不同的树的便里面,找到权重最小的边(u,v)。设C1和C2为边(u,v)所连接的两颗树,由推论23.2隐含告诉我门,(u,v)是一条安全边。
MST-KRUSKAL(G,w)
A = ϕ \phi ϕ
for v ∈ G . V \in G.V G.V
 MAKE-SET(v)
sort the edges of G.E into nondecreasiong order by weight w
for each edge(u,v) ∈ \in G.E ,taken in nondecreasing order by weight
 if FIND-SET(v) ≠ \neq =FIND-SET(u)
   A = A ∪ ( u , v ) A = A\cup{(u,v)} A=A(u,v)
  UNION(u,v)
return A
时间复杂度O(ElgV)

Prim算法

算法每一步在A和A之外的结点的所有边中,选择一条轻边加入A

MAT-PRIM(G,w,r)
for each u ∈ \in G.V
 key[u] = ∞ \infty
π [ u ] = N I L \pi[u] = NIL π[u]=NIL
key[r] = 0
Q = G.V
while Q ≠ ϕ Q\neq\phi Q=ϕ
 u = EXTRACT-MIN(Q)
 for each v ∈ v\in vG.adj[u]
i f v ∈ Q a n d w ( u , v ) < k e y [ v ] if v\in Q and \quad w(u,v) < key[v] ifvQandw(u,v)<key[v]
   key[v] = w(u,v)
   π [ v ] = u \pi[v] = u π[v]=u
prim使用最小堆 时间复杂度O(ElgV)
使用斐波那契堆O(E +VlgV)

最小生成树的性质

性质1

(u,v) ∈ \in E是树中最小的边,存在MST T,(u,v) ∈ \in T

性质2

性质3

将生成树中的边按权值排列,最小生成树的对应位置上的边是最小的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值