最小生成树

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

仍能找到边 ei 满足其一端在点集Vi ,另一端在点 集V \ Vi 中.
(i ) 由于 ei 有一端在Vi 之外,所以Vi 与 ET
中的边不构成圈. 当 i n 时,得到
( Vn {u1, u2 ,..., un } V , ETn) {e1, e2 ,..., en1},
即图T
Prim 算法的参考步骤
第一步 T0,w(T0)0,V {v0}。 第二步 对每一个点 vV V ,L(v)w(v, v0)(如果 (v, v0)E,则 w(v, v0) = )。 第三步 如果 V = V,输出 T0,w(T0),停止。否则进行 下一步。 第四步 在 V V 中找一点 u,使 L(u) = min{L(v) | vV V }, 并将 V 中与 u 邻接的点记为 x,e = (x, u)。 第五步 T0T0{e},w(T0)w(T0)+w(e), V V {u}。 第六步 对所有 vVV ,如 w(v, u) < L(v),则 L(v) w(v, u),否则 L(v) 不变。 第七步 转第三步。
Kruskal算法步骤
(1) 对属于E的边进行排序得 e1 e2 e (2) 初始化操作 0, T , k 0, t 0
(3)若t=n-1,则转(6),否则转(4)
4 (4)若 T {e k }构成一回路,则做k k 1, 转( )
(6)输出T,w,停止
思路如下: 1) 选择边e1,使得w(e1)尽可能小; 2) 若已选定边 e1, e2 ,..., ei ,则从 E \ {e1, e2 ,..., ei } 中选取ei 1 ,使得: i) G[{e1, e2 ,..., ei 1}] 为无圈图,
ii) w(ei 1) 是满足i)的尽可能小的权, 3) 当第2)步不能继续执行时,则停止. 定理4 由Kruskal算法构作的任何生成树 T * G[{e1, e2 ,..., e 1}] 都是最小树.
4
11 16 41Biblioteka Baidu53 69
结果显示于

• 最小生成树的 Kruskal 算法是 1956 年由Kruskal 提 出的。随后在 1957 年,领导贝尔实验室数学研究 室的 Prim 创立了他的算法。
令m表示边数
Kruskal 算法的时间复杂性以 O(mlog2m) 为界,当 边数较多或是一个完全图时,m (n 1)2,则时间复杂 性近似于 O(n2log2n)。而 Prim 算法的时间复杂性为 O(n2),所以,如果图的连通度较高(最高为完全图), 以 Prim 算法较好,如果图的连通度较低,特别当 m O(n) 时,则 Kruskal 算法更合适。
A 避圈法 定理3的充分性的证明提供了一种构造图的生 成树的方法. 这种方法就是在已给的图G中,每步选出一 条边使它与已选边不构成圈,直到选够n-1条边为 止. 这种方法可称为“避圈法”或“加边法” 在避圈法中,按照边的选法不同,找图中生 成树的方法可分为两种:深探法和广探法.
a) 深探法 例用深探法求出下图10的一棵生成树 步骤如下: i) 在点集V中任取一点u, 给以标号0. 令i=0 ii) 若某点v已得标号,检 图10 1 2 查一端点为v的各边,另一 8 7 端是否均已标号. 10 11 0 3 若有边vw之w未标号,则给 9 13 12 6 w以标号i+1,记下边vw.令 5 4 w代v,重复ii). 若这样的边的另一端均已有标号,就退到标号为 i-1的r点,以r代v,重复ii),直到全部点得到标号为止.
不难发现,图 的生成树不是 唯一的 .
3) 最小生成树(Minimum Spanning Tree)与算法
定义 13 设T (V , E1) 是赋权图 G (V , E ) 的一棵生 成树, T 中全部边上的权数之和为生成树的权, 称 记为
w(T ) ,即 w(T )
eE1 *
w(e) .
G1
G2
G3
G4
图 6.4.1
定理2 设G是具有n个顶点的图,则下述命题等价:
1) G是树( G无圈且连通);
2) G无圈,且有n-1条边; 3) G连通,且有n-1条边; 4) G无圈,但添加任一条新边恰好产生一个圈; 5) G连通,且删去一条边就不连通了(即G为最 最小连通图); 6) G中任意两顶点间有唯一一条路.
b)广探法 例用广探法求出下图10的一棵生成树 步骤如下: i) 在点集V中任取一点u, 给u以标号0. ii) 令所有标号i的点集为 Vi,检查[Vi,V\Vi]中的边端点 是否均已标号. 对所有未标 号之点均标以i+1,记下这些 边. iii) 对标号i+1的点重复步 步骤ii),直到全部点得到 标号为止.
( 树T 的边集 ET1) 为空集. 因为 G 是连通图, 点集V1与
V \ V1之间必有边相连,设 e1 u1u2为这样的边,
u1 属 于 V1 而 u2 属 于 V \ V1 . 则 得 V2 {u1, u2} ,
( 2) ET
{e1}. 重复进行上述步骤,对于
i Vi {u1, u2 ,..., ui }, Ti ) {e1, e2 ,..., ei 1}, n(| V |) , E(


(5)T T {e k }, k,t t 1, k k 1, 转( ) 3
例10用Kruskal算法求下图的最小树.
在左图中 {e1, e2 ,..., e8}权值 最小的边有 e1, e5 , 任取一条e1, 在 {e2 , e3 ,..., e8} 中选取权值 最小的边 e5 , {e2 , e3 , e4 , e6 , e7 , e8} : 中权值最小边有 e3 ,e7, 从中选 任取一条边 e3 ; {e2 , e4 , e6 , e7 , e8} 中选取在中选取 e7 , 在{e2 , e4 , e6 , e8}中选取 e4 ,e8 . 但 e4与 e8都 会与已选边构成圈,故停止,得
在实际应用中,还会遇到求一个赋权图的最大生 成树的问题。比如,某图的边权代表的是利润或效益, 则最终的问题很可能就是求其最大生成树。事实上, 从上面两个算法可以看出,只要边权的选择改为从大 到小,求最小生成树的算就可以用来求最大生成树了。
B破圈法
例11用破圈法求下图的最小树.
算法2 步骤如下: 1) 从图G中任选一棵树T1. 2) 加上一条弦e1,T1+e1中 立即生成一个圈. 去掉此 圈中最大权边,得到新 树T2,以T2代T1,重复2)再 检查剩余的弦,直到全 部弦检查完毕为止. 再加上弦e7,得到圈 v4v5v2v4, 先求出上图的一棵生成树. 加以弦 e2,得到的圈v1v3v2v1, 去掉最大的权边e6,得到一棵 新树;如此重复进行,直到全 去掉最大的权边e2,得到一棵新 树仍是原来的树; 全部的弦均已试过,得最小树.
1 1
图10
0 1 2 2 3 3 4 3 2 2 2 1
显然图10的生成树 不唯一.
B 破圈法
相对于避圈法,还有一种求生成树的方法叫做 “破圈法”. 这种方法就是在图G中任取一个圈, 任意舍弃一条边,将这个圈破掉,重复这个步骤 直到图G中没有圈为止. 取一圈{v1e1v2e3v3e2v1},去掉 e3 ; 例 用破圈法求出 取一圈{v1e1v2e4v4e5v3e2v1},去掉 e5 ; 下图的一棵生成树. 取一圈{v2e4v4e7v5e6v2},去掉e7 ;
最小生成树的Prim算法
• Prim算法思路 – 从任意一顶点开始,首先把这个顶点包括在生成树里, 然后在那些其一端已在生成树里,而另一端还未在生 成树里的边中,找权值最小的一条边,并把这条边和 其不在生成树里的那个顶点包括进生成树中。如此进 行下去,每次往生成树里加入一个顶点和一条权最小 的边,直到把所有顶点都包括进生成树里 – 理论上,当有两条具有相同最小权值的边可选择时, 选哪一条都行,因此构造的最小生成树不一定唯一。 但若给定算法,则唯一
从顶点a开始
步骤
u
L(b)
L(c)
L(d)
L(e)
L(f)
L(g)
e
V
T0
C(T0)
1
a
4
15

7

28
{a}

0
2
3 4 5 6 7
b
e c d g f

- - - - -
9
5 - - - -

32 25 - - -
7
- - - - -

16 16 -
28
28 28 12 - -
(a,b)
(a,e) (c,e) (c,d) (d,g) (d, f)
{a, b}
{a, b, e} {a, b, e, c} {a, b, e, c, d} {a, b, e, c, d, g} {a, b, e, c, d, g, f}
{(a, b)}
{(a, b), (a, e)} {(a, b), (a, e), (c, e)} {(a, b), (a, e), (c, e), (c, d)} {(a, b), (a, e), (c, e), (c, d), (d, g)} {(a, b), (a, e), (c, e), (c, d), (d, g), (d, f)}
取一圈{v1e1v2e6v5e8v3e2v1},去掉 e6 .
B 破圈法
例 用破圈法求出下图的另一棵生成树.
取一圈{v1e1v2e3v3e2v1}, 去掉 e3 ; 取一圈{v1e1v2e4v4e5v3e2v1},去掉 e4 ; 取一圈{v1e1v2e6v5e8v3e2v1},去掉 e8 ;
取一圈{v1e1v2e6v5e7v4e5v3e2v1}去掉 e6 ; 得到另一颗生成树.
2)图的生成树(或支撑树
Spanning Tree)
定义 若T是包含图G的全部顶点的子图,它又是树, 则称T是G的生成树. 图G中不在生成树的边叫做弦.
定理3 图G=(V,E)有生成树的充要条件是图G是连 通的.
证明 必要性是显然的.
充分性:任取 u1 V ,令集合V1 {u1},这时生成
1 1
图10
0 1 2 2 3 3 4 3 2 2 2 1
图10
b)广探法 例用广探法求出下图10的一棵生成树 步骤如下: i) 在点集V中任取一点u, 给u以标号0.令i=0. ii) 令所有标号i的点集为 Vi,检查[Vi,V\Vi]中的边端点 是否均已标号. 对所有未标 号之点均标以i+1,记下这些 边. iii) 对标号i+1的点重复步 步骤ii),直到全部点得到 标号为止.
4.最小生成树及算法
1) 树(tree)的定义与树的特征 定义 连通且不含圈的无向图称为树.常用T表示. 树中的边称为树枝. 树中度为1的顶点称为树叶. 孤立顶点称为平凡树.
v1
v2
v3
v4
v5
平凡树 注意:无向图
例如,图 6.4.1 给出的 G1 和 G2 是树,但G3 (有圈)和 G4 (不连通)则不是树。
如果生成树T 的权 w(T * ) 是 G 的所有生成树的权中最 小者,则称 T * 是 G 的最小生成树,简称为最小树,即
w(T * ) min{w(T )},式中取遍 G 的所有生成树T .
T
介绍最小生成树(MST)的三种算法: 避圈法( Kruskal算法和Prim算法)和破圈法.
A Kruskal算法
a) 深探法 例用深探法求出下图10的一棵生成树 步骤如下: i) 在点集V中任取一点u, 给u以标号0. ii) 若某点v已得标号,检 图10 查一端点为v的各边,另一 1 2 8 7 端是否均已标号. 10 11 3 若有边vw之w未标号,则给 0 9 13 12 w以标号i+1,记下边vw.令 6 5 4 w代v,重复ii). 若这样的边的另一端均已有标号,就退到标号为 i-1的r点,以r代v,重复ii),直到全部点得到标号为止.
(n ) (V , ET ) 有 n 1条边且无圈, 由定理 2 知,
这是一棵树,且为图 G 的一棵生成树.
一般来讲,一个图的生成树不唯一。例如,在 图6.4.2 中,(a)、(b)、(c) 均是 (d) 的生成树。
(a)
(b)
(c) 图 6.4.2
(d)
(II)找图中生成树的方法
可分为两种:避圈法和破圈法 A 避圈法 : 深探法和广探法 B 破圈法
相关文档
最新文档