文章目录
- 引言
- 二、最小支撑树问题
- 2.1 树的定义及其基本性质
- 2.2 图的支撑树
- 2.3 最小支撑树的定义及有关定理
- 2.4 最小支撑树算法
- 2.4.1 避圈法(KRUSKAL算法)
- 2.4.2 反圈法(PRIM算法)
- 2.4.3 破圈法
- 写在最后
引言
承接前文,了解了图论相关的基本知识后,我们来看看几个图论中经典的问题。
二、最小支撑树问题
2.1 树的定义及其基本性质
无圈的连通图称为树。
其有几个相互关联的基本性质。
树的性质 1 —— 若 T T T 是树,且树中点的个数 n T ≥ 2 n_T \geq 2 nT≥2 ,则 T T T 中至少有两个悬挂点。
树的性质 2 —— 图 T T T 是树,则 T T T 中的边数 m m m 等于点数 n n n 减去 1 ,即 m = n − 1. m=n-1. m=n−1.
树的性质 3 —— 图 T T T 是树的充分必要条件是任意两个顶点之间恰有一条链。
由性质 3 可得如下推论:
- 从一个树中去掉任意一边,则余下的图是不连通的。由此可知,在点集合相同的所有图中,树是含边树最少的连通图。
- 在树中不相邻的两个点之间填上一条边,则恰好得到一个圈。
综上,可以归纳出树 T T T 的六个基本性质,即:
- 无圈图;
- 连通图;
- m T = n T − 1 ; m_T=n_T-1; mT=nT−1;
- 减去一条边不连通;
- 加一条边恰有一个圈;
- 至少两个悬挂点。
2.2 图的支撑树
设图 T = ( V , E ′ ) T=(V,E') T=(V,E′) 是图 G = ( V , E ) G=(V,E) G=(V,E) 的支撑子图,如果图 T T T 是一个树,称其为 G G G 的一个支撑树。
定理 —— 图 G G G 有支撑树的充要条件是图 G G G 是连通的。
证明: 必要性显然成立。
充分性。设图 G G G 是连通图,如果本身不含圈,其本身是一个树,从而 G G G 是它本身的一个支撑树。如果 G G G 含圈,从圈中任意地去掉一条边,可得到 G G G 的一个支撑子图 G 1 G_1 G1 。如果 G 1 G_1 G1 不含圈,那么 G 1 G_1 G1 是 G G G 的一个支撑树;如果 G 1 G_1 G1 含圈,那么从 G 1 G_1 G1 中任取一个圈,从圈中再去掉一条边,得到 G 2 G_2 G2 ,如此重复,最终可以得到一个不含圈的支撑子图 G k G_k Gk,即支撑树。
此定理充分性的证明也启发我们一个寻找连通图的支撑树的办法。就是任取一个圈,从圈中去掉一边,对余下的圈重复这个步骤,直到不含圈为止,即可得到一个支撑树,这种方法称为“破圈法” 。
也可以反过来想,从图中任取一条边 e 1 e_1 e1 ,找一条不与 e 1 e_1 e1 构成圈的边 e 2 e_2 e2 ,再找一条不与 ( e 1 , e 2 ) (e_1,e_2) (e1,e2) 构成圈的边 e 3 e_3 e3 ,直到不能进行为止。此时,由所有取出的边所构成的图是一个支撑树,称此种方法为“避圈法” 。
2.3 最小支撑树的定义及有关定理
给定无向网络 G = ( V , E , W ) G=(V,E,W) G=(V,E,W) ,对于 G G G 中的每条边 e ∈ E e \in E e∈E ,设权 w ( e ) ≥ 0 w(e) \geq0 w(e)≥0 ,对于 G G G 的每一个支撑树 T T T ,我们定义 T T T 的权为 W ( T ) = ∑ e ∈ E w ( e ) W(T)=\sum_{e\in E}w(e) W(T)=e∈E∑w(e) 如果支撑树 T ∗ T^* T∗ 是所有支撑树中权最小者,则称 T ∗ T^* T∗ 为 G G G 的最小支撑树。
定理 —— 设 T T T 是网络 G = ( V , E , W ) G=(V,E,W) G=(V,E,W) 的支撑树,任意一个树外的边 e ∈ E e \in E e∈E ,唯一决定一个圈 C ( e ) C(e) C(e) 。除 e e e 外, C ( e ) C(e) C(e) 的其他边都属于 T T T ,如果 T T T 是 G G G 的一个最小支撑树,则 e e e 是 C ( e ) C(e) C(e) 中的最大权重边。
证明: 在圈 C ( e ) C(e) C(e) 中任取另一条边 e ′ e' e′ ,则 T ∪ { e } − { e ′ } T \cup\{e\}-\{e'\} T∪{e}−{e′} 仍然连通不含圈,即是一个树,记为 T ′ T' T′ ,有 W ( T ′ ) = W ( T ) + w ( e ) − w ( e ′ ) W(T')=W(T)+w(e)-w(e') W(T′)=W(T)+w(e)−w(e′) 。由于 T T T 为最小支撑树,有 W ( T ) ≤ W ( T ′ ) W(T) \leq W(T') W(T)≤W(T′) ,即 w ( e ) ≤ w ( e ′ ) w(e) \leq w(e') w(e)≤w(e′) ,由于 e ′ e' e′ 的任意性,故原命题得证。
定理 —— 设 T T T 是网络 G = ( V , E , W ) G=(V,E,W) G=(V,E,W) 的支撑树,则对于任意一条树上的边 e ∈ E e \in E e∈E ,唯一地决定 G G G 的一个割集 Φ ( e ) \varPhi(e) Φ(e) ,除了 e e e 外, Φ ( e ) \varPhi(e) Φ(e) 上的其他边都不属于 T T T ,如果 T T T 是 G G G 的最小支撑树,则 e e e 是 Φ ( e ) \varPhi(e) Φ(e) 中的最小权重边。
2.4 最小支撑树算法
主要有三个算法,分别是避圈法、反圈法和破圈法。
2.4.1 避圈法(KRUSKAL算法)
首先将网络 G G G 中的边按权大小排序,从最小边开始选起,每次选出一个新的边后要判断是否与所选的边构成一个圈,如果是则放弃该边,否则入选该边知道所选的边的数量等于点的数量减去 1 为止。每次选择边,优先选择权最小的边,所以又叫作最小边优选法。
2.4.2 反圈法(PRIM算法)
从图 G = ( V , E ) G=(V,E) G=(V,E) 中任取一个顶点放入树 T T T 的点集 V T V_T VT 中,对于将图 G G G 分成 V T , V ‾ T V_T,\overline{V}_T VT,VT 的割集 Φ ( V T ) \varPhi(V_T) Φ(VT) 来说,选取一个权最小的边放入树 T T T 的边集中,并将该边所关联的顶点放入 V T V_T VT 中,重复上述步骤,直到所有顶点均选入 V T V_T VT 为止。
2.4.3 破圈法
设 G ( k ) G^{(k)} G(k) 是 G G G 的连通生成子图(开始 G ( 0 ) = G G^{(0)}=G G(0)=G),若 G ( k ) G^{(k)} G(k) 中不包含圈,则其为最小支撑树;若其中包含圈,选圈中权重最大的一条边去掉,重复上述过程,直到找不到圈为止。
写在最后
下一个问题,我们来看看最短路问题!