prim算法正确性证明:
证明:令无向图为
G
=
(
V
,
E
)
G = (\mathbf{V},\mathbf{E})
G=(V,E),其中
V
=
{
v
1
,
v
2
,
…
,
v
n
}
\mathbf{V} = \{v_1,v_2,\dots,v_n\}
V={v1,v2,…,vn},
E
=
{
e
1
,
e
2
,
…
,
e
m
}
\mathbf{E} =\{e_1,e_2,\dots,e_m\}
E={e1,e2,…,em},其生成树为
G
′
=
(
V
,
E
′
)
G'=(\mathbf{V},\mathbf{E}')
G′=(V,E′),其中
E
′
=
{
e
t
1
,
e
t
2
,
…
,
e
t
n
−
1
}
\mathbf{E}'=\{e_{t_1},e_{t_2},\dots,e_{t_{n-1}}\}
E′={et1,et2,…,etn−1},且
G
′
G'
G′为连通无环图。
(贪心选择性质)
不失一般性,令起始点为
v
1
v_1
v1,贪心选择策略是找到与
v
1
v_1
v1连接边最短的节点,以及相应的边的点记为
v
a
v_a
va,相应的边为
e
b
=
(
v
1
,
v
a
)
e_b=(v_1,v_a)
eb=(v1,va),现证明
e
b
e_b
eb包括在某个最优解中。
令
G
′
G'
G′为一棵最小生成树,其中不包括
e
b
e_b
eb,则将
e
b
e_b
eb加入
G
′
G'
G′中,将形成一个环,不考虑该环之外的节点,每个节点的度刚好为2,令该环中与
v
1
v_1
v1相关的另一条边为
e
c
e_c
ec,则删除
e
c
e_c
ec后,获得另一棵生成树
G
′
′
G''
G′′,由于
w
(
e
b
)
≤
w
(
e
c
)
w(e_b)\le w(e_c)
w(eb)≤w(ec),
G
′
′
G''
G′′也一定为一棵最小生成树。
(最优子结构性质)
不失一般性, 令某棵最小生成树
T
1
T_1
T1中, 权值最小的边
e
1
e_1
e1连接的两个节点设为
v
a
v_a
va和
v
b
v_b
vb, 在原图
G
G
G去除边
e
1
e_1
e1,合并
v
a
v_a
va和
v
b
v_b
vb,令
V
′
=
{
v
1
,
v
2
,
…
,
v
n
−
1
}
\mathbf{V'}=\{v_1,v_2,\dots,v_{n-1}\}
V′={v1,v2,…,vn−1},将节点
v
a
v_a
va和
v
b
v_b
vb合并后节点设为
v
c
v_c
vc,对于
G
G
G中同时和
v
a
v_a
va和
v
b
v_b
vb相连的边,选择其中权值最小的边与合并的
v
c
v_c
vc相连,得到新的子图
G
′
G'
G′,现需证明
G
G
G的最小生成树
T
1
T_1
T1包含图
G
′
G'
G′的生成树
T
1
′
T_1'
T1′是图
G
′
G'
G′的最小生成树,。
假设
G
′
G'
G′的最小生成子树不是
T
1
′
T_1'
T1′,则存在另外一棵生成树
T
1
′
′
T_1''
T1′′。即
W
(
T
1
′
′
)
W(T_1'')
W(T1′′)<
W
(
T
1
′
)
W(T_1')
W(T1′),将
T
2
T_2
T2的点
v
c
v_c
vc分裂成点
v
1
v_1
v1和
v
2
v_2
v2,以边
e
1
=
(
v
1
,
v
2
)
e_1=(v_1,v_2)
e1=(v1,v2)相连,则得到图
G
G
G的一棵生成树
T
′
T'
T′,有
W
(
T
′
)
=
W
(
T
1
′
′
)
+
w
(
e
1
)
<
W
(
T
1
′
)
+
w
(
e
1
)
W(T')=W(T_1'')+w(e_1)<W(T_1')+w(e_1)
W(T′)=W(T1′′)+w(e1)<W(T1′)+w(e1)
这与假设中的 T 1 T_1 T1为最优最小生成树矛盾。