最小生成树的形成
管理一个遵循下属循环不变式的集合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
∣V∣−1次
安全边
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是安全的 A⊆MSTTA∪{(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 X∪Y=V,X∩Y=ϕ,X=ϕ,Y=ϕ
- (u,v)穿过割 u ∈ X , v ∈ Y u\in X,v\in Y u∈X,v∈Y
- 割尊敬集合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是安全的
A⊆MSTTcut(X,Y)尊敬A(u,v)是穿过cut(X,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
x∈X,y∈Y,
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,A⊆T−{(x,y)}A⊆T′,A∪(u,v)⊆T′由于T′是最小生成树,(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
v∈G.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]
ifv∈Qandw(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
将生成树中的边按权值排列,最小生成树的对应位置上的边是最小的。