贪心选择——Prim算法正确性证明
prim算法
设现有一无向连通图
G
=
(
V
,
E
)
\bm{G}=(\bm{V,E})
G=(V,E),其中边集
E
=
{
e
1
,
e
2
,
e
3
,
.
.
.
e
m
}
\bm{E}=\{e_1,e_2,e_3,...e_m\}
E={e1,e2,e3,...em},节点集
V
=
{
v
1
,
v
2
,
v
3
,
.
.
.
v
n
}
\bm{V}=\{v_1,v_2,v_3,...v_n\}
V={v1,v2,v3,...vn}。prim算法目的是要从确定的节点
v
i
v_i
vi出发形成一颗最小生成树,即生成树(无向无环连通图)中所包含的边集权重和最小。
定义
T
=
(
V
,
E
′
)
\bm{T=(V,E^{'})}
T=(V,E′)为图
G
\bm{G}
G从节点
v
1
v_{1}
v1出发生成的最小生成树,其中最小生成树中的边集合
E
=
{
e
a
1
,
e
a
2
,
e
a
3
,
.
.
.
e
a
(
n
−
1
)
}
\bm{E}=\{e_{a1},e_{a2},e_{a3},...e_{a(n-1)}\}
E={ea1,ea2,ea3,...ea(n−1)}
prim算法正确性证明
贪心选择性证明
证明贪心选择性即证明贪心选择的第一步是正确的,换句话说贪心选择的第一步一定包含在某个全局最优解中。
在Prim算法中,由确定的节点
v
1
v_{1}
v1出发,选择与此节点相连边集中权重最小的边
e
a
{e_a}
ea。设存在一个最小生成树
T
\bm{T}
T且其边集合中不包含边
e
a
{e_a}
ea,此时把边
e
a
{e_a}
ea加入此树就会形成环,如果断开树中与
v
1
v_{1}
v1相连的另外一条边
e
b
{e_b}
eb,则此时仍然是只有n-1条边的无向连通图,故也是一棵树。由于此时产生的生成树
T
′
\bm{T^{'}}
T′相较于最优解
T
\bm{T}
T只是把边
e
b
{e_b}
eb替换为了
e
a
{e_a}
ea,而
e
a
{e_a}
ea是与
v
1
v_{1}
v1相连的最小权重边,因此
W
(
T
′
)
≤
W
(
T
)
\bm{W(\bm{T^{'}})}\le\bm{W(\bm{T})}
W(T′)≤W(T),故
T
′
\bm{T^{'}}
T′也是最小生成树。
综上Prim算法的贪心选择性质得证。
最优子结构性质证明
最优子结构性质是说原问题的最优解中包含子问题的最优解,由于贪心选择算法是一种自底向上的最优选择算法,如果高层问题的最优解不包含底层问题的最优解,那么子问题贪心选择出的最优解是没有意义的。
不失一般性,令
T
=
(
V
,
E
′
)
\bm{T=(V,E^{'})}
T=(V,E′)为图
G
\bm{G}
G从节点
v
1
v_{1}
v1出发生成的最小生成树,令出发节点
v
1
v_{1}
v1相连的最小边
e
1
{e_1}
e1的另一端节点为
v
a
v_{a}
va,有上一步证明得知边
e
1
{e_1}
e1在最优解边集
E
′
E^{'}
E′中。现在将图
G
\bm{G}
G和树
T
\bm{T}
T中的节点
v
1
v_{1}
v1和
v
a
v_{a}
va融合为一个节点,除去边
e
1
{e_1}
e1,与融合后节点相连的重复边只保留权值最小的那条边,此时产生子图
G
2
\bm{G_2}
G2和子树
T
2
\bm{T_2}
T2。现需证明子树
T
2
\bm{T_2}
T2为子图
G
2
\bm{G_2}
G2的最小生成树。
假设树
T
2
\bm{T_2}
T2不是图
G
2
\bm{G_2}
G2的最小生成树,而是另一棵树
T
2
′
\bm{T_2^{'}}
T2′,即
W
(
T
2
′
)
≤
W
(
T
2
)
\bm{W(\bm{T_2^{'}})}\le\bm{W(\bm{T_2})}
W(T2′)≤W(T2),此时将融合节点还原为节点
v
1
v_{1}
v1和
v
a
v_{a}
va,并加入边
e
1
{e_1}
e1得到树
T
′
\bm{T^{'}}
T′。
此时
W
(
T
′
)
=
W
(
T
2
′
)
+
W
(
e
1
)
≤
W
(
T
)
=
W
(
T
2
)
+
W
(
e
1
)
\bm{W(\bm{T^{'}})}=W(\bm{T_2^{'}})+W(\bm{e_1}) \le \bm{W(\bm{T})=W(\bm{T_2})+W(\bm{e_1}) }
W(T′)=W(T2′)+W(e1)≤W(T)=W(T2)+W(e1),这与假设矛盾,故树
T
2
\bm{T_2}
T2确是图
G
2
\bm{G_2}
G2的最小生成树。
综上最优子结构性质得证。