4.3最小生成树全解.ppt

4.3最小生成树全解

离散数学 离散数学 4.3 最小生成树问题 基本概念 prim算法 Kruskal算法 * 数学离散 * 4.3.1树的定义 定义: 连通无回路的图称为树,记为T;其度为1的顶点称为叶子结点。显然,有边的树至少有两个叶子结点。 a b c d e e d b a c b c d e a * 离散数学 * 几种等价说法 设G(p,q) 是一个图,于是,下列五种说法相互等价: G是树; (1) ?(2) G连通且q = p – 1; (2) ?(3) G无回路且q = p – 1; (3) ?(4) G无回路,但对任意的u,v∈V(G),若uv ? E(G),则G+uv中恰有一条回路; (4) ?(5) G连通,但对任意e ∈E(G) , G–e不连通。(5) ?(1) * 离散数学 * 图的生成树 生成树:G是一个图,若G的生成子图T是树, 则称T为G的生成树。(G的生成树可能不唯一。) 一个图G的生成树是 ⑴G的生成子图,因此它包含了G的全部顶点; ⑵无回路的连通图(树)。 §4.3.2 最优树问题 prim算法 Kruskal算法 * 离散数学 * 最优树问题 在一个赋权连通图中,找一个具有最小权的生成树(连通的生成子图)。这种树称为最优树。 最优树具有非常广泛的用途,如:连接若干个城市的造价最低的公路网,连接若干网站的通讯网,等等。 最优树问题与最短通路问题不同之处在于它要考虑的是总体上的最优。 * 离散数学 * Prim算法构造最小生成树 设置两个集合 P 和Q ,其中 P 用于存放G 的最小生成树中的顶点,集合Q 存放G的最小生成树中的边。 令集合 P 的初值为 P = {v1}(假设构造最小生成树时,从顶点v1出发),集合Q 的初值为空集。prim 算法的思想是从所有 p∈ P ,v ∈V - P 的边中,选取具有最小权值的边 pv ,将顶点v 加入集合 P 中,将边 pv 加入集合Q 中,如此不断重复,直到 P =V 时,最小生成树构造完毕,这时集合Q 中包含了最小生成树的所有边。 * 离散数学 * Kruskal 算法的思想 给定连通图G,设G的各边权非负且无环: 首先选择一条权值最小的边; 然后逐条增加边的数目。增加的方法是:从未选入的边中挑选一条不会形成回路的权值最小边。 这样一直到选满p-1条边。 显然,这样得到的是无回路的p-1条边的子图,即一棵生成树。 * 离散数学 * Kruskal 算法应用举例 9 5 1 4 8 7 6 2 3 6 G 11 e1 e2 e3 e4 e5 e6 e7 e8 e9 e10 将边按权值排序后: {e2, e9, e7, e8, e3, e6, e10, e5, e4, e1} i ET={} {e2} i {e2, e9} i {e2, e9 , e7} i i i {e2, e9 , e7 , e6} i i {e2, e9 , e7 , e6 , e5} i 已经达到5(6-1)条边,算法结束。 * 离散数学 * a=zeros(7); a(1,2)=50;a(1,3)=60; a(2,4)=65;a(2,5)=40; a(3,4)=52;a(3,7)=45; a(4,5)=50;a(4,6)=30; a(4,7)=42;a(5,6)=70; a=a+a; a(a==0)=inf; result=[]; p=1; tb=2:length(a); prim算法matlab程序 * 离散数学 * while size(result,2)~=length(a)-1 temp=a(p,tb); temp=temp(:); d=min(temp); [jb,kb]=find(a(p,tb)==d); j=p(jb(1)); k=tb(kb(1)); result=[result,[j;k;d]]; p=[p;k]; tb(find(tb==k))=[]; end result prim算法matlab程序 * 离散数学 * a(1,2)=50;a(1,3)=60; a(2,4)=65;a(2,5)=40; a(3,4)=52;a(3,7)=45; a(4,5)=50;a(4,6)=30; a(4,7)=42;a(

文档评论(0)

1亿VIP精品文档

相关文档