第二章 树
2.1 树的概念与性质
★树的概念
森林
不含圈的图称为无圈图 (acyclic graph), 无圈图也称作森林 (forest).
树
树 (tree) 是连通的无圈图.
树的 11 度点称为树叶(leaf).
注:
- (1)树与森林都是简单图;
- (2) 树与森林都是二部图.
树的应用
树是图论中应用最为广泛的一类图. 在理论上, 由于树的简单结构, 常常是图论理论研究的“试验田”. 在实际问题中, 许多实际问题的图论模型就是树.
族谱图与树
要把一个家族的繁衍情况简洁直观表达出来, 用点表示家族中成员, 成员x是成员y的儿女, 把点x画在点y的下方, 并连线. 如此得到的图, 是一棵树, 称为根树. 示意如下:
实际上, 根树是许多问题的模型, 如社会结构, 计算机数据结构, 数学中的公式结构, 分类枚举表示等.
化学中的分子结构与树
Arthur Cayley 1875年用树的模型研究了化学同分异构体的计数问题
如: C4H10的两种同分异构结构图模型为:
电网络中独立回路与图的生成树
早在19世纪, 图论还没有引起人们关注的时候, 物理学家Kirchhoff 就已经注意到电路中的独立回路与该电路中生成树的关系, 进而发现了Kirchhoff电流定律. 即: 如果电路是(n,m)图, 则独立回路的个数为m−n+1. 并且, 生成树添上生成树外的G的一条边, 就可以得到一独立回路.
总之, 树在图论研究和应用上都是十分典型的特殊图.
树的性质
定理1
每棵非平凡树至少有两片树叶.
证明: 设 P=v1v2…vkP=v_1v_2…v_k 是非平凡树 TT 中一条最长路, 则 v1v_1 与 vkv_k 在 TT 中的邻接点只能有一个, 否则, 要么推出 PP 不是最长路, 要么推出 TT 中存在圈, 这都是矛盾!即说明 v1v_1 与 vkv_k 是树叶.
定理2
图 GG 是树当且仅当 GG 中任意两点都被唯一的路连接.
证明:
“必要性”
若不然, 设 P1P_1 与 P2P_2 是连接 uu 与 vv 的两条不同的路. 则由这两条路的全部或部分将构成一个圈, 这与 GG 是树相矛盾.
“充分性”
首先, 因 GG 的任意两点均由唯一路相连, 所以 GG 是连通的.
其次, 若 GG 中存在圈, 则在圈中任取点 uu 与 vv, 可得到连接 uu 与 vv 的两条不同的路, 与条件矛盾, 所以 GG 是无圈图.
综上, GG 是树.
★定理3
设 TT 是 (n,m)(n, m) 树, 则: m=n−1m=n-1.
证明: 对 nn 作数学归纳.
当 n=1n=1 时, 等式显然成立; 设 n=kn=k 时等式成立. 考虑 n=k+1n=k+1 的树 TT.
由定理1, TT 中至少有两片树叶, 设 uu 是 TT 中树叶, 考虑 T1=T−uT_1=T−u , 则 T1T_1 为 kk 阶树, 于是 m(T1)=k−1m(T_1)=k−1, 得 m(T)=km(T)=k.
这就证明了定理.
例
设 TT 为 1212 条边的树, 其顶点度为 1,2,51, 2, 5. 如果 TT 恰有 33 个度为 22 的顶点, 那么 TT 有多少片树叶?
解: 设 TT 有 xx 片树叶. 由 m=n−1m=n−1 得 n=13n=13.
于是由握手定理得: 1×x+2×3+5×(10−x)=2×121×x+2×3+5×(10-x)=2×12.
得 x=8x=8.
推论
具有 kk 个分支的森林有 n−kn−k 条边.
证明: 设森林 GG 的 kk 个分支为 Ti(1≤i≤k)T_i (1 ≤ i ≤ k). 对每个分支, 使用定理3得:
m(Ti)=ni−1,(ni=∣V(Ti)∣)m(T_i)=n_i-1,(n_i=|V(T_i)|)
所以:
m(G)=∑i=1km(Ti)=n−km(G)=\sum_{i=1}^k m(T_i)=n-k
定理4
每个 nn 阶连通图的边数至少为 n−1n−1.
证明: 如果 nn 阶空图 GG 不连通且有 nn 个分支. 给 GG 加入一条边最多减少 GG 的一个分支. 那么要使 GG 连通, 即一个分支, 则至少要加入 n−1n−1 条边.
注: 树也被称为最小连通图.
定理5
任意树 TT 的两个不邻接顶点之间添加一条边后, 可以得到唯一圈.
证明: 设 uu 与 vv 是树 TT 的任意两个不邻接顶点, 由定理2知: 有唯一路 PP 连接 uu 与 vv. 于是 P∪{uv}P∪\{uv\} 是一个圈.
显然,由 PP 的唯一性也就决定了 P∪{uv}P∪\{uv\} 的唯一性.
例
设 GG 是树且 Δ≥kΔ≥k, 则 GG 至少有 kk 片树叶.
证明: 若不然, 设 GG 有 nn 个顶点, 至多 k−1k−1 个一度顶点, 由于 Δ≥kΔ≥k, 于是, 由握手定理得:
2m(G)=∑v∈V(G)d(v)≥k−1+k+2(n−k)=2n−1>2n−22m(G)=\sum_{v∈V(G)}d(v)≥k-1+k+2(n-k)=2n-1>2n-2
所以, 有: m(G)>n−1m(G)>n−1, 与 GG 是树矛盾!
例
设 GG 是森林且恰有 2k2k 个奇度点, 则在 GG 中有 kk 条边不重合的路 P1,P2,…,PkP_1, P_2, …, P_k, 使得:
E(G)=E(P1)∪E(P2)∪⋯∪E(Pk)E(G)=E(P_1)∪E(P_2)∪⋯∪E(P_k)
证明: 对 kk 作数学归纳.
当 k=1k=1 时, GG 只有两个奇数度顶点, 此时, 容易证明, GG 是一条路;
设当 k=tk=t 时, 结论成立. 令 k=t+1k=t+1.
在 GG 中一个分支中取两个一度顶点 uu 与 vv, 令 PP 是连接 uu 与 vv 的唯一路, 则 G−E(P)G−E(P) 是有 2t2t 个奇数顶点的森林, 由归纳假设, 它可以分解为 tt 条边不重合的路之并, 所以 GG 可以分解为 t+1t+1 条边不重合的路之并.
注: 对图作某种形式的分解, 是图论的一个研究对象, 它在图结构分析中具有重要作用.
树的度序列问题
在第一章中, 介绍了判定一个非增非负序列是否为简单图的度序列定理. 下面介绍一个判定非增非负序列是否为树的度序列的简单方法.
定理
设 S={d1,d2,…,dn}S=\{d_1, d_2, …, d_n\} 是 nn 个正整数的序列, 它们满足: d1≥d2≥…≥dn,∑di=2(n−1)d_1≥d_2 ≥ … ≥ d_n, \sum d_i=2(n−1). 则存在一棵树 TT, 其度序列为 SS.
证明: 对 nn 作数学归纳.
当 n=1n=1 和 22 时, 结论显然. 假设对 n=kn=k 时结论成立. 考虑 n=k+1n=k+1.
首先, 序列中包含 11. 否则, 序列中数都大于等于 22, 序列之和大于 2k2k, 与条件 ∑di=2(n−1)=2k\sum d_i=2(n−1)=2k 矛盾!
所以, dk+1=1d_{k+1}=1. 从序列中删掉 d1d_1 和 dk+1d_{k+1}, 增加数 d∗=d1−1d^*=d_1−1 放在它应该在的位置 (按从大到小排列). 得到序列 S1S_1. 该序列含 kk 个数, 序列和为 2(k−1)2(k−1), 由归纳假设, 存在树 T1T_1, 它的度序列为 S1S_1.
现在, 增加结点 vv, 把它和 T1T_1 中点 d∗d^* 相连得到树 TT. 树 TT 为所求.
2.2 ★树的中心与形心
离心率 e(v)e(v)
顶点 vv 的离心率 (eccentricity): e(v)=max{d(u,v)∣u∈V(G)}e(v)=\max\{d(u,v)|u∈V(G)\}
半径 r(G)r(G)
图的半径 (radius): r(G)=min{e(v)∣v∈V(G)}r(G)=\min\{e(v)|v∈V(G)\}
即所有点中最小离心率.
直径
图的直径 (diameter): (所有顶点中) 最大离心率.
注:
- (i) 通信网络中, 一般直径越小, 网络延迟越小;
- (ii) 亦可使用平均距离衡量; 事实上等价于衡量 D(G)=∑u,v∈V(G)d(u,v)D(G)=\sum_{u,v∈V(G)}d(u,v);
- (iii) 事实上, D(G)D(G) 被称作 Wiener index. Harry Wiener 1947 年用其研究石蜡的沸点 (boiling point): Wiener 指标越大, 沸点越高.
中心点
图的中心点 (center): 离心率等于半径的点.
中心
图的中心: 中心点的集合.
Jordan 定理
(Jordan,1869) 每棵树的中心由一个点或两个相邻点组成.
证明: 对树 TT 的阶数 nn 作归纳. 当 n=1n=1 或 22 时,结论显然成立.
设对 n<k(k≥3)n<k(k ≥ 3) 的树结论成立. 设 TT 是 kk 阶树.
容易知道: 删掉 TT 的所有叶子, 得到的树 T1T_1 的每个点的离心率比它们在 TT 中离心率减少 11 (TT 中叶子点的离心率比其邻点大 11 ).
又因 TT 的叶不能是中心点, 所以 TT 的中心点在 T1T_1 中.
这样, 若点 uu 的离心率在 TT 中最小, 则在 T1T_1 中依然最小 (T1T_1 中每个点的离心率都比T中的对应点小 11), 即说明 TT 的中心点是 T1T_1 的中心点(中心不变), 反之亦然.
因为 T1T_1 的阶数 <k<k, 所以, 由归纳假设, T1T_1 的中心为一个点或两个相邻点组成, 即证明 TT 的中心由一个点或两个相邻点组成.
注:
(1) Jordan定理事实上可以求树的半径 (只有一个中心点时剪叶的次数; 两个中心点时剪叶的次数+1) 以及直径 (只有一个中心点时半径的2倍; 两个中心点时半径的2倍−1).
(2) 确定图的中心有应用价值. 例如, 确定社区医院的修建位置, 就可以建模成求图的中心问题.
2.3 生成树
生成树的概念与性质
★生成树, 生成森林
图 GG 的一个生成子图 TT 如果是树, 称它为 GG 的一棵生成树 (spanning tree); 若 TT 为森林, 称它为 GG 的一个生成森林 (spanning forest).
用 τ(G)\tau (G) 表示 GG 的生成树棵数.
生成树的应用: 生成树协议
Radia Joy Perlman (born in 1951, 美国程序员和网络设计工程师) 于1981年设计了生成树协议 (Spanning Tree Protocol). 该协议是工作在OSI网络模型中的第二层(数据链路层)的通信协议.
生成树协议的主要目的是防止交换机冗余链路产生的环路. 用于确保以太网中无环路的逻辑拓扑结构. 从而避免了广播风暴, 大量占用交换机的资源.
定理
每个连通图至少包含一棵生成树.
证明: 如果连通图 GG 是树, 则其本身是一棵生成树; 若连通图 GG 中有圈 CC, 则去掉 CC 中一条边后得到的图仍然是连通的, 这样不断去掉 GG 中圈, 最后得到一个 GG 的无圈连通子图 TT, 它为 GG 的一棵生成树.
注:
- 定理的证明实际上给出了连通图 GG 的生成树的求法, 该方法称为 (删边) 破圈法. 利用破圈法, 显然也可以求出任意图的一个生成森林.
- 连通图 GG 的生成树一般不唯一!
推论
若 GG 是 (n,m)(n, m) 连通图, 则 m≥n−1m≥n-1.
★生成树的计数: 凯莱递推计数法
收缩 G⋅eG \cdot e
图 GG 的边 ee 称为被收缩 (contraction), 是指删掉 ee 后, 把 ee 的两个端点等同 (identify), 如此得到的图记为 G⋅eG \cdot e.
定理 (Cayley, 1889)
设 ee 是 GG 的一条边 (非自环), 则有:
τ(G)=τ(G−e)+τ(G⋅e)\tau(G)=\tau(G-e)+\tau(G\cdot e)
证明: 考虑 GG 的任一条边 ee. GG 的生成树中包含边 ee 的棵数为 τ(G⋅e)\tau(G\cdot e), 而不包含 ee 的棵数为 τ(G−e)\tau(G−e). 即证.
例
利用凯莱递推法求下图生成树的棵数.
共 88 棵生成树.
凯莱公式的缺点
- 计算量很大;
- 不能具体指出每棵生成树.
★生成树的计数: 矩阵树定理
矩阵树定理
设 GG 是顶点集合为 V(G)={v1,v2,…,vn}V(G)=\{v_1, v_2, …, v_n\} 的无环图 (loopless graph), 设 L=(lij)L=(l_{ij}) 是 GG 的 Laplacian 矩阵, 其中:
lij={d(vi),i=j−aij,i≠jl_{ij}=\left\{\begin{matrix}d(v_i),i=j\\ -a_{ij},i\neq j\end{matrix}\right.
aija_{ij} 为邻接矩阵的元素, 则 GG 的生成树棵数为 LL 的任意一个元素 lijl_{ij} 的代数余子式的值.
矩阵树定理的证明思路
① L=MMTL=MM^T, 其中 MM 是 GG 的任一定向有向图的关联矩阵;
② MM 的任一 n−1n-1 阶子方阵的行列式是 ±1±1, 如果这 n−1n-1 条边对应一棵生成树;
③ LL 的任一代数余子式 =M∗(M∗)T=M^*(M^*)^T 的, M∗M^* 是删除 MM 的任一行 tt 之后的矩阵.
例
利用矩阵树定理求下图生成树的棵数.
解: 图的 Laplacian 矩阵为:
L=(2−1−10−12−10−1−13−100−11)L=\begin{pmatrix}2&-1&-1&0\\ -1&2&-1&0\\ -1&-1&3&-1\\ 0&0&-1&1\end{pmatrix}
第一行第一列元素对应的代数余子式为:
(−1)1+1∣2−10−13−10−11∣=3(−1)^{1+1} \begin{vmatrix} 2&−1&0\\ −1&3&−1\\ 0&−1&1 \end{vmatrix} =3
例
(W. Borchardt, 1860; Cayley Formula) 证明 τ(Kn)=nn−2\tau (K_n)=n^{n−2}.
证法一: KnK_n 的Laplacian矩阵为:
L(Kn)=(n−1−1⋯−1−1n−1⋯−1⋯−1−1⋯n−1)n×nL(K_n)=\begin{pmatrix}n-1&-1&\cdots&-1\\ -1&n-1&\cdots&-1\\ &\cdots\\ -1&-1&\cdots&n-1\end{pmatrix}_{n \times n}
第一行第一列元素的代数余子式为:
(−1)1+1∣n−1−1⋯−1−1n−1⋯−1⋯−1−1⋯n∣(n−1)×(n−1)(-1)^{1+1} \begin{vmatrix} n-1&-1&\cdots&-1\\ -1&n-1&\cdots&-1\\ &\cdots\\ -1&-1&\cdots&n\\ \end{vmatrix}_{(n-1) \times (n-1)}
所以: τ(Kn)=nn−2\tau (K_n)=n^{n−2}.
证法二: Prüfer code (1918)
n−2n−2 长的 nn 元 Prüfer 序列有 nn−2n^{n−2} 个, 故 τ(Kn)=nn−2\tau (K_n)=n^{n−2}.
注: 例的证明有多种不同方法. 用矩阵树定理证明是最直接和便于计算的方法. 1967年, 加拿大数学家Moon用10多种方法证明了例, 之后又涌现出一些不同的证明方法.
Prüfer 序列
一棵标号树与一个 Prüfer 序列是唯一地对应的. 亦即在标号树和 Prüfer 序列之间构成一个双射. 构造双射是组合数学中的一种重要方法.
一棵标号树可以得到一个 Prüfer 序列:
- 第 ii 步, 取当前树中标号最小的顶点, 删去它并记其邻点的标号为序列中第 ii 个元素.
- 重复进行上述操作, 直到剩下的树恰有 22 个顶点.
- 此时 Prüfer 序列包含恰好 n−2n−2 个元素.
一个 Prüfer 序列可以得到一棵标号树:
- 考虑集合 A={1,2,…,n}A=\{1,2,…,n\}.
- 将序列中未出现在 AA 中的最小元素对应的点与序列中的第一个点连边.
- 然后从序列和 AA 中分别删除该元素, 重复上述操作 n−2n−2 次.
- 最后将集合中剩余的两个元素连边.
例
证明: 若 ee 为 KnK_n 的一条边, 则: τ(Kn−e)=(n−2)nn−3\tau(K_{n}-e)=(n-2)n^{n-3}.
证法一: 若 ee 为 KnK_n 的一条边, 由 KnK_n 中的边的对称性以及每棵生成树的边数为 n−1n−1, KnK_n 的所有生成树的总边数为: (n−1)nn−2(n-1)n^{n-2}.
所以, 每条边 (ee 这条边) 出现在生成树的次数为:
(n−1)nn−212n(n−1)=2nn−3\frac{(n-1)n^{n-2}}{\frac{1}{2}n(n-1)}=2n^{n-3}
所以, Kn−eK_{n−e} 对应的生成树的棵数为 (把包含 ee 的生成树减掉):
τ(Kn−e)=nn−2−2nn−3=(n−2)nn−3\tau(K_n-e)=n^{n-2}-2n^{n-3}=(n-2)n^{n-3}
证法二: 假设在 KnK_n 中去掉的边 e=v1vne=v_1v_n, 则 Kn−eK_n−e 的 Laplacian 矩阵为:
L=(n−2−1⋯0−1n−1⋯−1⋯0−1⋯n−2)L= \begin{pmatrix} n-2&-1&⋯&0\\ -1&n-1&⋯&-1\\ &⋯&&\\ 0&-1&⋯&n-2 \end{pmatrix}
于是由矩阵树定理:
τ(Kn−e)=∣n−1−1⋯−1−1−1n−1⋯−1−1⋯−1−1⋯n−1−1−1−1⋯−1n−2∣=∣n−1−1⋯−1−1−1n−1⋯−1−1⋯−1−1⋯n−1−1−1−1⋯−1n−1)∣+∣n−1−1⋯−10−1n−1⋯−10⋯−1−1⋯n−10−1−1⋯−1−1∣=nn−2−2nn−3=(n−2)nn−3\begin{aligned} τ(K_n-e)=& \begin{vmatrix} n-1&-1&⋯&-1&-1\\ -1&n-1&⋯&-1&-1\\ &&⋯&&\\ -1&-1&⋯&n-1&-1\\ -1&-1&⋯&-1&n-2 \end{vmatrix}\\ =& \begin{vmatrix} n-1&-1&⋯&-1&-1\\ -1&n-1&⋯&-1&-1\\ &&⋯&&\\ -1&-1&⋯&n-1&-1\\ -1&-1&⋯&-1&n-1) \end{vmatrix} + \begin{vmatrix} n-1&-1&⋯&-1&0\\-1&n-1&⋯&-1&0\\&&⋯&&\\-1&-1&⋯&n-1&0\\-1&-1&⋯&-1&-1 \end{vmatrix}\\ =&n^{n-2}-2n^{n-3}\\ =&(n-2) n^{n-3} \end{aligned}
生成树计数的应用
例: 等效电阻
计算下图电网络中 1, 2 两点的等效电阻大小(数字代表电阻).
解: 用等效电阻直接计算如下:
那么 1,2 之间的等效电阻大小为 58\frac{5}{8}.
换一个思路:
先计算生成树的棵数 (当然也可以枚举)
再计算分离 1,2 两点的生成 22-森林 (22 个分支的森林) 的个数
可以发现分离 1,2 两点的生成森林的个数与生成树的棵数正好是 58\frac{5}{8}.
这是巧合吗?
定理 (G. Sharpe, B. Spain, 1960)
令 GG 是一个无向连通图, u,vu,v 是 GG 的任意两个顶点. 则 u,vu,v 两点之间的等效电阻 rG(u,v)r_G(u,v):
rG(u,v)=ζG(u,v)τ(G)r_{G}(u,v) =\frac{\zeta_G(u,v)}{\tau(G)}
其中 ζG(u,v)\zeta_G(u,v) 表示分离 u,vu,v 两点的生成 22-森林的个数.
定理’ (G. Sharpe, B. Spain, 1960) 令 GG 是一个阶数至少为 33 的无向连通图, u,vu,v 是 GG 的任意两个顶点. 则 u,vu,v 两点之间的等效电阻 rG(u,v)r_G(u,v):
rG(u,v)=detL(u,v)detL(u)r_G(u,v)=\frac{\det L(u,v)}{\det L(u)}
其中 detL(u,v)\det L(u,v) 为 Laplacian 矩阵中删除 u,vu,v 所对应行, 列后的行列式.
回路系统简介
弦, 树枝
设 TT 是连通图 GG 的一棵生成树, 把属于 GG 但不属于 TT 的边称为 GG 关于 TT 的弦 (chord), TT 中的边称为 GG 关于 TT 的树枝.
在上图中, 红色边导出图的一棵生成树. 则红色边为 GG 对应于该生成树的树枝, 紫色边为 GG 对应于该生成树的弦.
基本圈
设 TT 是连通图 GG 的一棵生成树, 由 GG 的对应于 TT 一条弦与 TT 中树枝构成的唯一圈 CC, 称为 GG 关于 TT 的一个基本圈 (fundamental cycle).
若 GG 是 (n,m)(n, m) 连通图, 把 GG 对应于 TT 的 m−n+1m−n+1 个基本圈称为 GG 对应于 TT 的基本圈系统 (fundamental cycle system). 记为 CfC_f.
例如图 GG 和对应生成树 TT:
基本圈为:
定理
设 TT 是连通图 G=(n,m)G=(n, m) 的一棵生成树, C1,C2,…,Cm−n+1C_1, C_2, …, C_{m−n+1} 是 GG 对应于 TT 的基本圈系统. 定义: 1⋅Gi=Gi,0⋅Gi=∅1 \cdot G_i = G_i, 0 \cdot G_i = \varnothing, GiG_i 是 GG 的回路 (这里指每个点都是偶度的子图). 则 GG 的回路组作成的集合对于该乘法和图的对称差运算构成数域 F={0,1}F=\{0, 1\} 上的 m−n+1m−n+1 维向量空间.
证明:
(1) 非空、两闭、8条容易证明.
(2) 首先证明 C1,C2,…,Cm−n+1C_1, C_2, …, C_{m−n+1} 线性无关.
若不然, 设 C1,C2,…,Cm−n+1C_1, C_2, …, C_{m−n+1} 线性相关, 那么存在一组不全为零的数 a1,a2,…,am−n+1a_1, a_2, …, a_{m−n+1}, 使得:
a1C1△a2C2△⋯△am−n+1Cm−n+1=∅a_1 C_1 \bigtriangleup a_2 C_2 \bigtriangleup ⋯ \bigtriangleup a_{m-n+1} C_{m-n+1}= \varnothing
但是, 任意两个基本圈包含两条不同弦, 所以, 若某个 ak≠0a_k≠0, 则
a1C1△a2C2△⋯△am−n+1Cm−n+1≠∅a_1 C_1 \bigtriangleup a_2 C_2 \bigtriangleup ⋯ \bigtriangleup a_{m-n+1} C_{m-n+1}≠ \varnothing
矛盾!故 C1,C2,…,Cm−n+1C_1, C_2, …, C_{m−n+1} 线性无关.
其次证明 GG 的任意一个回路均可由 C1,C2,…,Cm−n+1C_1, C_2, …, C_{m−n+1} 线性表出.
设 BB 是 GG 的任一回路, 显然, 它至少含一条弦, 不失一般性, 令:
B={ei1,ei2,⋯eij,eij+1,⋯ ,eik}B=\{e_{i_1},e_{i_2},\cdots e_{i_j},e_{i_{j+1}},\cdots,e_{i_k}\}
其中: ei1,ei2,⋯eije_{i_1},e_{i_2},\cdots e_{i_j} 为弦, eij+1,⋯ ,eike_{i_{j+1}},\cdots,e_{i_k} 为树枝.
又设包含弦 ei1,ei2,⋯eije_{i_1},e_{i_2},\cdots e_{i_j} 的基本圈为 Ci1,Ci2,⋯CijC_{i_1},C_{i_2},\cdots C_{i_j}.
令: B1=Ci1△Ci2△⋯△CijB_1=C_{i_1} \bigtriangleup C_{i_2} \bigtriangleup ⋯ \bigtriangleup C_{i_j}.
显然, BB 中弦均包含在 B1B_1 中, 于是 B△B1B \bigtriangleup B_1 只含树枝不含弦. 但是, 可以证明: 两个回路的对称差一定是回路. 因此 B△B1B \bigtriangleup B_1 中只含树枝不含弦是不可能的.
所以: B△B1=∅B \bigtriangleup B_1 = \varnothing, 得 B=B1B = B_1. 故 GG 的任意一个回路均可由 C1,C2,…,Cm−n+1C_1, C_2, …, C_{m−n+1} 线性表出.
定理说明, 连通图 GG 的所有回路作成子图空间的一个子空间, 该空间称为回路空间或回路系统.
例
求下图 GG 的回路空间的一个基底和它的全部元素.
解: 取 GG 的一棵生成树 TT 为:
GG 对于生成树 TT 的基本圈为:
C1={a,b,c}C2={a,b,d,e}C3={a,b,d,g,h}C4={d,f,g}\begin{aligned} C_1&=\{a,b,c\}\\ C_2&=\{a,b,d,e\}\\ C_3&=\{a,b,d,g,h\}\\ C_4&=\{d,f,g\}\\ \end{aligned}
图形为:
所有可能的和为:
B1=C1△C2={c,d,e}B2=C1△C3={c,d,g,h}B3=C1△C4={a,b,c,d,f,g}B4=C2△C3={e,g,h}B5=C2△C4={a,b,e,f,g}B6=C3△C4={a,b,f,h}B7=C1△C2△C3={a,b,c,e,g,h}B8=C1△C2△C4={c,e,f,g}B9=C1△C3△C4={c,f,h}B10=C2△C3△C4={d,e,f,h}B11=C1△C2△C3△C4={a,b,c,d,e,f,h}\begin{array}{lll} B_1&=C_1 \bigtriangleup C_2&=\{c,d,e\} \\ B_2&=C_1 \bigtriangleup C_3&=\{c,d,g,h\} \\ B_3&=C_1 \bigtriangleup C_4&=\{a,b,c,d,f,g\} \\ B_4&=C_2 \bigtriangleup C_3&=\{e,g,h\} \\ B_5&=C_2 \bigtriangleup C_4&=\{a,b,e,f,g\} \\ B_6&=C_3 \bigtriangleup C_4&=\{a,b,f,h\} \\ B_7&=C_1 \bigtriangleup C_2 \bigtriangleup C_3&=\{a,b,c,e,g,h\} \\ B_8 & =C_1 \bigtriangleup C_2 \bigtriangleup C_4 & =\{c,e,f,g\} \\ B_9 & =C_1 \bigtriangleup C_3 \bigtriangleup C_4 & =\{c,f,h\} \\ B_{10} & =C_2 \bigtriangleup C_3 \bigtriangleup C_4 & =\{d,e,f,h\} \\ B_{11} & =C_1 \bigtriangleup C_2 \bigtriangleup C_3 \bigtriangleup C_4 & =\{a,b,c,d,e,f,h\} \end{array}
例: 回路系统的一个应用
Kirchhoff 定律:
- (1) 任一点的电流和为零;
- (2) 任一个圈上的电压和是相应电流与电阻乘积的和.
对上面左图的三个圈 VYXV, VWYV 和 VWYXV 分别应用 Kirchhoff 第二定律得到方程:
- (1) i1R1+i2R2=Ei_1R_1+i_2R_2=E;
- (2) i3R3+i4R4−i2R2=0i_3R_3+i_4R_4-i_2R_2=0;
- (3) i1R1+i3R3+i4R4=Ei_1R_1+i_3R_3+i_4R_4=E.
但第 (3) 式的信息是冗余的: (1)+(2) 可得到 (3). 这是因为 (3) 所对应的圈不是基本圈, 该圈可由 VYXV 和 VWYV 表出.
所以由基本圈系统的知识, 只要对 n−m+1n-m+1 个基本圈应用 Kirchhoff 第二定律列出相应公式, 再由 Kirchhoff 第一定律列出 n−m+1n-m+1 个电流公式即可联立解出电路的电阻, 电流和电压.
由电路的一个基本圈系统, 列出下面公式:
VYXV,i1R1+i2R2=E,VYZV,i2R2+i5R5+i6R6=0,VWZV,i3R3+i5R5+i7R7=0,VYWZV,i2R2−i4R4+i5R5+i7R7=0.\begin{array}{lll} &VYXV,& i_{1}R_{1}+i_{2}R_{2}& =E, \\ &VYZV,& i_{2}R_{2}+i_{5}R_{5}+i_{6}R_{6} & =0, \\ &VWZV,& i_{3}R_{3}+i_{5}R_{5}+i_{7}R_{7} & =0, \\ &VYWZV,& i_{2}R_{2}-i_{4}R_{4}+i_{5}R_{5}+i_{7}R_{7} & =0. \end{array}
再由再由四个顶点, 列出下面公式:
X,i0−i1=0,V,i1−i2−i3+i5=0,W,i3−i4−i7=0,Z,i5−i6−i7=0.\begin{array}{lll} &X, &i_0-i_1 & =0, \\ &V, &i_{1}-i_{2}-i_{3}+i_{5} & =0, \\ &W, &i_{3}-i_{4}-i_{7} & =0, \\ &Z, &i_{5}-i_{6}-i_{7}& =0. \end{array}
联立即得.
2.4 最小生成树
最小连接问题
交通网络中, 常常关注能把所有站点连接起来的生成树, 使得该生成树各边权值之和为最小. 例如:
假设要在某地建造5个工厂, 拟修筑道路连接这5处. 经勘探, 其道路可按下图的无向边铺设. 现在每条边的长度已经测出并标记在图的对应边上, 如果我们要求铺设的道路总长度最短, 这样既能节省费用, 又能缩短工期 , 如何铺设?
不难发现: 最小代价的连接方式为:
最小连接问题的要求为:
- (1) 连接的边数最少(但图要连通);
- (2) 连接的边的总权值最小.
★最小生成树
连通赋权图中权值最小的生成树 (生成树中所有边权值的和) 称为最小生成树 (minimum spanning tree).
★Kruskal 算法
算法思想
从 GG 中的最小边开始, 避圈式的扩张.
算法复杂度
O(n2logn)O(n^2\log n)
算法
(1) 选择边 e1e_1, 使得其权值最小;
(2) 若已经选定边 e1,e2,…,eke_1, e_2, …, e_k, 则从 E−{e1,e2,…,ek}E - \{e_1, e_2, …, e_k \} 中选择边 ek+1e_{k+1} , 使得:
-
a) G[e1,e2,…,ek+1]G[e_1, e_2, …, e_{k+1}] 为无圈图;
-
b) ek+1e_{k+1} 的权值 w(ek+1)w(e_{k+1}) 尽可能小.
(3) 当(2)不能进行时, 停止.
例
用 Kruskal 算法求下图的最小生成树.
解:
定理
由 Kruskal 算法得到的任何生成树一定是最小生成树.
(证明略)
例
在一个边赋权 GG 中, 下面算法是否可以产生有最小权值的生成路?为什么?
算法:
(1) 选一条边 e1e_1, 使得 w(e1)w(e_1) 尽可能小;
(2) 若边 e1,e2,…,eie_1, e_2, …, e_i 已经选定, 则用下述方法从 E−{e1,..,ei}E-\{e_1, .., e_i\} 中选取边 ei+1e_{i+1} 使得:
-
a) G[e1,e2,…,ei,ei+1]G[{e_1, e_2, …, e_i, e_{i+1}}] 为不交路之并 (仅可能在路的端点相交);
-
b) w(ei+1)w(e_{i+1}) 是满足 a) 的尽可能小的权.
(3) 当 (2) 不能继续执行时停止.
解: 该方法不能得到一条最小生成路.
在下图 GG 中我们用算法求生成路:
用算法求出的生成路为:
直接在图中选出的一条生成路为:
后者的权值小于前者.
破圈法 (管梅谷)
在 Kruskal 算法基础上, 我国著名数学家山东师范大学管梅谷教授于 1975 年提出了最小生成树的破圈法.
算法
破圈法求最小生成树的求解过程是:
从赋权图 GG 的任意圈开始, 去掉该圈中权值最大的一条边, 称为破圈. 不断破圈, 直到 GG 中没有圈为止, 最后剩下的 GG 的子图为 GG 的最小生成树.
例
用破圈法求下图 GG 的最小生成树.
解:
反馈点集
反馈点集 (Feedback Vertex Set) 问题:
-
Instance (实例): 设 GG 是一个图, kk 是一个正整数.
-
Question (问题): 是否存在一个大小不超过 kk 的顶点子集 SS 使得 G−SG−S 不包含圈?
对最大度不超过 44 的图 GG, 该问题是 NP-困难的.
Remark: 破圈法和反馈点集, 从外表上看类似, 一个删边, 一个删点, 都使得剩余图没有圈. 但问题的复杂度大相径庭(差之毫厘, 谬以千里).
相关问题: 有向图的反馈点集和反馈弧 (有向边) 集问题都是 NP-完全的.
★Prim 算法
算法复杂度
O(n2logn)O(n^2\log n)
算法
对于连通赋权图 GG 的任意一个顶点 uu, 选择与点 uu 关联的且权值最小的边作为最小生成树的第一条边 e1e_1;
在接下来的边 e2,e3,…,en−1e_2, e_3, …, e_{n-1}, 在与一条已经选取的边只有一个公共端点的所有边中, 选取权值最小的边.
例
用 Prim 算法求下图的最小生成树.
解:
最小生成树权值为: w(T)=10w(T) =10.
贪心算法
Remark: 本节讲的最小生成树的三个算法都是基于贪心算法 (greedy algorithm) 的思想设计的: 每一步选择局部最优, 从而期望得到全局最优的算法.
-
如果组合优化问题满足拟阵的结构, 那么可以用适当的贪心算法得到最优解. 如最小生成树的三个算法.
-
不满足拟阵的结构的问题, 贪心算法可能得不到最优解. 如旅行商问题(TSP), 该问题将在第四章中介绍.
拟阵 (matriod) 是对向量空间中线性无关这一概念的概括与归纳. 拟阵有许多等价的定义, 参见 https://en.wikipedia.org/wiki/Matroid
2.5 根树简介
计算机中数据结构常采用根树结构. 族谱图也是根树.
有向树
一棵树 TT, 如果每条边都有一个方向, 称这种树为有向树 (directed tree).
对于 TT 的顶点 vv 来说, 以点 vv 为终点的边数称为点 vv 的入度 (indegree), 以点 vv 为起点的边数称为点 vv 的出度 (outdegree). 入度与出度之和称为点 vv 的度.
★根树
一棵非平凡的有向树 TT, 如果恰有一个顶点的入度为 00, 而其余所有顶点的入度为 11, 这样的有向树称为根树 (rooted tree).
其中入度为 00 的点称为树根 (root),
出度为 00 的点称为树叶 (leaf),
入度为 11, 出度大于等于 11 的点称为内点 (internal vertex).
又将内点和树根统称为分支点 (branch vertex).
注: 根树常画成倒置形式, 方向由上指向下.
层数, 树高
对于根树 TT, 顶点 vv 到树根的距离称为点 vv 的层数 (level).
所有顶点中的层数的最大者称为根树 TT 的树高 (height).
上图中, 根树高为 33 (树根1: 0层; 点2, 3, 4: 第1层; 余类推).
有序树
对于根树 TT, 若规定了每层顶点的访问次序, 这样的根树称为有序树.
注: 一般次序为从左至右. 有时也用边的次序代替顶点次序.
子根树
对于根树 TT, 由点 vv 及其 vv 的后代导出的子图, 称为根树的子根树 (sub-rooted tree).
★ mm 元根树, 完全 mm 元树
对于根树 TT, 若每个分支点至多 mm 个儿子, 称该根树为 mm 元根树 (mm-ary rooted tree); 若每个分支点恰有 mm 个儿子, 称它为完全 mm 元树 (complete mm-ary rooted tree).
★定理
对于完全 mm 元树 TT, 有如下性质:
在完全 mm 元树 TT 中, 若树叶数为 tt, 分支点数为 ii, 则:
(m−1)i=t−1(m-1)i=t-1
证明: 一方面, 由树的性质得:
m(T)=(i+t)−1(1)m(T)=(i+t)-1 \tag{1}
另一方面, 由握手定理得:
2m(T)=t+m+(i−1)(m+1)(2)2m(T)=t+m+(i-1)(m+1) \tag{2}
由 (1) 与 (2) 消去 m(T)m(T) 得:
(m−1)i=t−1(m-1)i=t-1
例
一台计算机, 它有一条加法指令, 可以计算 33 个数的和. 如果要求 99 个数的和, 问至少执行多少次加法指令?
解: 用 33 个顶点表示 33 个数, 用一个父结点表示 33 个数的和. 问题转化为求一棵有 99 个叶点的完全 33 元树的分支点数. 即: m=3,t=9m=3 , t= 9, 求 ii.
由定理得: (3−1)i=9−1(3-1)i=9-1.
i=4i=4, 至少要执行 44 次. 两种可能情况是:
赋权二元树
在m元树中, 应用最广泛的是二元树, 原因是它在计算机中容易处理.
设 TT 是一棵二元树, 若对所有 tt 片树叶赋权值 wi(1≤i≤t)w_i(1≤i≤t), 且权值为 wiw_i 的树叶层数为 L(wi)L(w_i), 称:
W(T)=∑i=1twiL(wi)W(T)=\sum_{i=1}^t w_i L(w_i)
为该赋权二元树的权 (weight).
★最优二元树
在所有赋权为 wiw_i 的二元树中 W(T)W(T) 最小的二元树称为最优二元树.
★哈夫曼算法
Huffman 算法 (亦称 Huffman 编码):
-
(1) 初始: 令 S={w1,w2,…,wi,…,wj,…,wt}S=\{w_1, w_2, …,w_i,…,w_j,…,w_t\};
-
(2) 从 SS 中取出两个权值最小者 wiw_i 与 wjw_j, 画结点 viv_i, 带权 wiw_i, 画结点 vjv_j, 带权 wjw_j, 画 viv_i 与 vjv_j 的父亲 vv, 连接 viv_i 与 vv, 连接 vjv_j 与 vv, 令 vv 带权 wi+wjw_i + w_j;
-
(3) 令 S=(S−{wi,wj})∪{wi+wj}S = (S−\{w_i , w_j\})∪\{w_i+w_j\};
-
(4) 判断 SS 是否只含一个元素, 若是, 停止, 否则转(2).
注:
- (1) 哈夫曼编码是前缀码, 因此是变长码, 不是纠错码;
- (2) 权一般代表发生的概率.
例
求带权为: 7, 8, 9, 12, 16的最优树.
解: 由哈夫曼算法:
{7,8,9,12,16}⇒{9,12,15,16}⇒{15,16,21}⇒{21,31}⇒{52}\{7, 8, 9, 12, 16\} \Rightarrow \{9, 12, 15, 16\} \Rightarrow \{15, 16, 21\} \Rightarrow \{21, 31\} \Rightarrow \{52\}
无损数据压缩算法
RLE 算法
RLE算法 (Run Length Encoding): 把文件内容用”数据×重复次数”的形式来表示的压缩算法.
AAAAAABBCDDEEEEEF → A6B2C1D2E5F1
17个文字 (17字节) → 12个文字 (12字节)
Huffman 算法
用”二叉树”的形式实现哈夫曼编码的算法.
AAAAAABBCDDEEEEEF
实现: 出现频率越高的字符用尽可能少的位数来表示.
| 字符 | 出现频率 | 编码 | 位数 |
|---|---|---|---|
| A | 6 | 10 | 2 |
| E | 5 | 11 | 2 |
| B | 2 | 01 | 2 |
| D | 2 | 001 | 3 |
| C | 1 | 0000 | 4 |
| F | 1 | 0001 | 4 |
总位数=4+4+3∗2+2∗2+2∗5+2∗6=40=4+4+3*2+2*2+2*5+2*6=40 (5字节)