Prim算法的正确性证明

Prim算法的正确性证明

令无向图为 G = ( V , E ) G = ( V, E) G=(V,E),其中 V = { v 1 , v 2 , . . . , v n } V=\left \{ v_{1} ,v_{2},...,v_{n} \right \} V={ v1,v2,...,vn},其生成树为 G ′ = ( V , E ′ ) G^{'}=\left ( V,E^{'} \right ) G=(V,E),其中 E ′ = { e t 1 , e t 2 , . . . , e t n − 1 } E^{'}=\left \{e _{t_{1}},e _{t_{2}},...,e _{t_{n-1}} \right \} E={ et1,et2,...,etn1},且 G ′ G^{'} G为联通无环图。

1. 贪心选择性质

不失一般性,令起始节点为 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)。现证明包括在某个最优解中。

G ′ G^{'} G为一棵最小生成树,其中不包括 e b e_b eb,则将 e b e_b eb加入中,形成一个环,不考虑该环之外的节点,每个节点的度刚好为2,令该环中与 v 1 v_1 v1相关的另一条边为 e c e_c ec,则删除后,获得另外一棵生成树 G ′ ′ G^{''} G′′。由于 w ( e b ) < = w ( e c ) w(e_b) <= w(e_c) w(eb)<=w(ec), G ′ ′ G^{''} G′′也一定为一棵最小生成树。

2. 最优子结构

不失一般性,令通过prim算法得到的某棵最小生成树 G G G中,节点度数最小的两个节点对应的字符为 a a a b b b,将两个节点进行合并操作得到一个新的节点,对应字符记为 c c c,同时新的最小生成树为 G 1 G_1 G1,需要证明 G 1 G_1 G1为最小生成树。

假设其最小生成树不是 G 1 G_1 G1,则另外一棵最小生成树 G 2 G_2 G2, s.t. W ( G 2 ) < W ( G 1 ) W(G_2) < W(G_1) W(G2)<W(G1),将的 c c c节点重新扩展成为 a a a b b b两个节点,且以边 e = ( a , b ) e = (a, b) e=(a,b)相连,易得此使最小生成树无环,且是一个有 n − 1 n-1 n1条边的连通图,获得 G 3 G_3 G3,可以得到: G 3 = G 2 + w ( e ) < G 1 + w ( e ) = G G_3 = G_2 + w(e) < G_1 + w(e) = G G3=G2+w(e)<G1+w(e)=G

这与假设中的G为最小生成树的假设矛盾,因此得证。

猜你喜欢

转载自blog.csdn.net/qq_44624316/article/details/129947631
今日推荐