这里是离散数学图论的学习笔记,然而由于学校的关系跳过了集合论、序偶、二元关系等一些可能运用到的基础知识,所以可能数学符号和表述方面会有一些问题 qaq
图是一个三元组 \(\langle V(G), E(G), \varphi_G \rangle\)(或四元组 \(\langle V(G), E(G), \varphi_G, \psi_G \rangle\)),其中 \(V(G)\) 为图的结点集,\(E(G)\) 为图的边集,\(\varphi_G\) 为 \(E(G)\) 中元素到序偶的函数,\(\psi_G\) 为 \(E(G)\) 中的元素到任意字符集 \(S\) 的函数。我们通常将图简记为 \(G = \langle V, E \rangle\), 我们要求 \(V\) 为非空集合。
现在给出一些定义:如果图中所有边都用有序偶 \(\langle v_i, v_j \rangle\) 表示,则称其为有向图,如果所有边都用无序偶 \((v_i, v_j)\) 表示,则称其为无向图。如果既有无序偶又有有序偶的图称为混合图。
只有孤立结点的图为零图,只有单个结点的零图称为平凡图。(trivial !)
如果一条边在 \(V\) 中出现多次,则称这些边为平行边,出现的次数称为这条边的重数。如果一条边的起点和终点(两个端点)相同,则我们称这条边为自回路或环。
我们定义不含平行边的图为线图,不含自回路的线图称为简单图。
与结点 \(u\) 相关联的边数为该结点的度数,记作 \(\deg(u)\);其中以结点 \(u\) 为起点的边数为出度,记作 \(\deg^+(u)\),以结点 \(u\) 为终点的边数为入度,记作 \(\deg^-(u)\)。我们将图 \(G\) 中最小的度数称为最小度,记作 \(\delta(G).\)
我们显然有:
有了这些结论,注意到 \((2)\) 式表明任何图中所有结点度数之和为偶数,我们容易得到一个推论,任何图中,奇数度数的结点一定有偶数个。
我们给出完全图的概念,如果简单图 \(G = \langle V, E \rangle\) 中,如果每一对点都有边将其相连,则该图称为完全图。\(n\) 个点的完全图记作 \(K_n.\) 显然,\(K_n\) 有 \(\dbinom{n}{2}\) 条边。如果图中每个结点的度数均为 \(k\),我们将此图称为 \(k\) 次正则图,显然 \(n\) 个点的完全图是 \(n - 1\) 次正则图。
如果给定一个图 \(G\),由图 \(G\) 中所有结点和所有能使 \(G\) 变成一个完全图所需添加的边构成的图被称为绝对补图,记作 \(\overline{G}\)。
设图 \(G = \langle V, E \rangle, G\' = \langle V\', E\' \rangle\),其中 \(V\' \subseteq V, E\' \subseteq E\),则称 \(G\'\) 为 \(G\) 的子图,记作 \(G\' \subseteq G\)。如果 \(E\' \subseteq E, V = V\'\),则 \(G\'\) 称为图 \(G\) 的生成子图,如果有 \(V\' \subseteq V\),而 \(E\'\) 包括了原图中两个端点都在 \(V\'\) 内的所有边,则称 \(G\'\) 为由 \(V\'\) 导出的子图。如果图 \(G\'\' = \langle V\'\', E\'\' \rangle\) 使得 \(E\'\' = E - E\'\),\(V\'\'\) 中仅包含 \(E\'\'\) 中的边关联的结点,则图 \(G\'\'\) 称为 \(G\'\) 相对于 \(G\) 的补图。
设图 \(G = \langle V, E \rangle\) 和图 \(G\' = \langle V\', E\' \rangle\),如果存在双射 \(f:V \rightarrow V\'\),使得 \(\forall e = (v_i, v_j) \in E\)(或 \(\langle v_i, v_j \rangle \in E\)),当且仅当 \(\exists e\' = (f(v_i), f(v_j)) \in E\'\)(或 \(\langle f(v_i), f(v_j) \rangle \in E\'\) ),则称 \(G\) 和 \(G\'\) 同构。记作 \(G \simeq G\'\)。
给定图 \(G = \langle V, E \rangle, v_0, v_1, \cdots, v_n \in V, e_1, e_2, \cdots, e_n \in E\),其中 \(e_i\) 为关联 \(v_{i - 1}\) 和 \(v_i\) 的边,则称由结点和边交替组成的序列 \(v_0e_1v_1e_2 \cdots e_nv_n\) 称为图中的连接 \(v_0, v_n\) 的一条路。其中 \(v_0, v_n\) 分别称为路的起点和终点,边的数目 \(n\) 称为路的长度,当 \(v_0 = v_n\) 时,则称为回路。
如果一条路经过的边互不相同,则这条路称作迹;如果一条路经过的结点互不相同,则这条路称作通路;如果一条路仅有起点和终点相同,则这条路称作圈。
如果在无向图 \(G = \langle V, E \rangle\) 中,对于两个在图中的结点 \(v_i, v_j\),存在一条 \(v_i\) 到 \(v_j\) 的路。则我们称两个结点 \(v_i, v_j\) 是连通的。由鸽巢原理,我们可以知道在有 \(n\) 个点的图中,两个点如果联通,则这两个点之间一定存在一条长度小于 \(n\) 的通路。
如果一个图中任意两个结点均连通,则这个图为连通图。对于一个图的结点集,我们总能找到对其的一个划分,\(V_1, V_2, \cdots, V_k\),在这些子集中,属于同一个集合的结点连通,不属于同一个集合的结点不连通,则我们称这些子集均为图的一个连通分支,一个图 \(G\) 中连通分支的个数我们记作 \(W(G)\)。
对于一个无向连通图 \(G = \langle V, E \rangle\),如果 \(V\' \subseteq V\),删去图中 \(V\'\) 内的所有点,图不再连通。而删去 \(V\'\) 任意真子集内的所有结点,图仍然连通,则称 \(V\'\) 称为图的一个点割集。如果仅由一个结点就构成了图的一个点割集,则这个结点称为割点。定义一个图的点连通度为 \(k(G) = \min\{\lvert V\' \rvert \mid V\' \text{为 } G \text{ 的点割集}\}\)。显然完全图 \(K_p\) 的点连通度为 \(p - 1\)。
一个比较显然的结论是,一个点 \(u\) 是割点当且仅当存在一组点 \(v, w\),使得连接这两个点的所有路中都经过 \(u\)。
类似的,对于一个无向连通图 \(G = \langle V, E \rangle\),如果 \(E\' \subseteq E\),删去图中 \(E\'\) 内的所有边及其关联的结点,图不再连通。而删去 \(E\'\) 中任意真子集内的所有边及其相关联的结点,图仍然连通,则称 \(E\'\) 是一个边割集。如果仅由一条边就构成了图的一个边割集,则称这条边称为图的割边(桥)。定义一个图的边连通度为 \(\lambda(G) = \min\{\lvert E\' \rvert \mid E\' \text{为 } G \text{ 的边割集}\}\)。
我们可以通过感性理解得出 \(k(G) \le \lambda(G) \le \delta(G).\)
我们上面都是对于无向图给出了一些连通的定义,我们现在给出一些有向图关于连通的定义。如果对于两个在有向图的结点 \(v_i, v_j\),存在一条 \(v_i\) 到 \(v_j\) 的一条路,则称从 \(v_i\) 可达 \(v_j\)。
如果一个有向简单图中任意两个点都互相可达,则称此图为强连通图。如果一个有向简单图中任意的一对结点至少从一个结点到另一个结点可达,则称此图为单侧连通图。如果一个有向简单图中所有边去除方向,变成一个无向图,若这个无向图为连通图,则称这个图为弱连通图。
这三个定义显然有这样的关系:强连通图 \(\Rightarrow\) 单侧连通图 \(\Rightarrow\) 弱连通图。
我们根据定义,可以得出强连通图的一个充要条件,即存在一个回路,使得这个回路经过每个结点至少一次。
如果一个简单有向图中,具有强连通性质的最大子图,称为最大强连通子图(强分图),同理也有最大单侧连通子图(单侧分图),最大弱连通分图(弱分图)。需要说明的是,这里的最大是指选定的子图如果再添加在原图而不在此子图中的任意一个结点(当然和这个结点相关联且另一端点在原子图中的边也会被加进来),都不能使这个子图仍然保持它原有的性质。而并不是结点数最多的意思。
现在我们来证明一个重要的结论:
对于有向简单图 \(G = \langle V, E \rangle\),其每一个结点恰好仅位于一个强分图中。
设 \(u\) 为 \(V\) 中的任意结点,则设集合 \(S\) 为与 \(u\) 相互可达的所有结点组成的集合。显然由 \(S\) 集合导出的子图为一个强分图,故 \(u\) 至少在一个强分图中。
而若假设 \(u\) 在两个不同的强分图 \(G_1, G_2\) 中,这两个不同的强分图的结点集合分别为 \(V_1, V_2\)。则由强分图的性质,\(V_1, V_2\) 中的结点均与 \(u\) 相互可达,则可知 \(V_1, V_2\) 中的任意一组结点均可通过 \(u\) 相互可达,故由 \(V_1 \cup V_2\) 所导出的子图也拥有强连通性质。这与 \(G_1, G_2\) 为强分图矛盾,所以 \(u\) 只能在一个强分图中。
图可以用各种矩阵表示,其中有三种比较重要,邻接矩阵,可达性矩阵,关联矩阵。
一个 \(n\) 个结点的图的邻接矩阵 \(A\) 为 \(n\) 阶方阵,其值为:
显然对应无向简单图,我们有:
对于有向简单图,我们有:
我们可以发现邻接矩阵的一些性质,对于一个图的邻接矩阵 \(A\),其 \(k\) 次方 \(A^k\) 中第 \(i\) 行第 \(j\) 列的意义为从 \(v_i\) 到 \(v_j\) 有几条长度为 \(k\) 的路。将其视作动态规划,我们可以很容易的理解这一过程。
一个 \(n\) 个结点的图的可达性矩阵 \(P\) 为 \(n\) 阶方阵,其值为:
由上面的结论可知 \(P\) 即为 \(\sum_{i = 1}^{n} A^i\) 这个矩阵中所有非 0 值的位置换成 1 所形成的矩阵。
当然我们发现我们只关心 \(A^i\) 中是否有值,故更简洁的,我们有 \(P = \bigvee_{i = 1}^n A^{(i)}\),对于这里矩阵乘法中的乘和加替换为了布尔乘(逻辑与)和布尔加(逻辑或)。
一个有 \(n\) 个结点,\(m\) 条边的无向图的完全关联矩阵 \(M\) 为一个 \(n \times m\) 矩阵,其值为:
完全关联矩阵有一些性质:
- 如果不是自回路每一列有两个 1;
- 每一行之和为对应结点的度数;
- 如果一行的值全为 0,则该结点为孤立结点;
- 每个平行边其对应两列相同;
- 两个同构的图的完全关联矩阵仅可能有行序,列序的差别。
如果为有向图则:
一个有向强连通图 \(G\),其可达性矩阵 \(P\) 为全 1 矩阵;一个有向单侧连通图 \(G\) 其可达性矩阵满足 \(P \or P^\mathrm{T}\) 为全 1 矩阵;一个有向弱连通图 \(G\),其可达性矩阵满足以 \(P \or P^\mathrm{T}\) 为邻接矩阵的无向图的可达性矩阵为全 1 矩阵。
我们着手研究一些图的特殊性质,我们定义如果无向图中存在一条路,使得其通过各条边恰好一次,则称这条路为欧拉路。如果这条路还是一个回路时,则称这条路为欧拉回路,有欧拉回路的图称为欧拉图。
这里要给出一个重要的判定条件(我们默认图中没有孤立结点):
一个简单无向图中存在欧拉路的充要条件是这个图是连通的且有 0 个或 2 个奇度数结点。
考虑充分性和必要性分开证明。并且约定图中的点数为 \(n\),边数为 \(m\)。
- 充分性
考虑图中的一条欧拉路为 \(v_0 e_1 v_1 e_2 \cdots v_{m - 1} e_m v_m\),由于图中没有孤立结点且这条路包含所有边,故这条路包含了图中的所有结点。故图是连通的。而我们发现由于 \(e_i\,(i \in [1, m])\) 各不相同所以如果我们进入了 \(v_i\,(i \in [1, m - 1])\),必然会从一条之前没有遍历的边出来。所以可知对于 \(v_i\,(i \in [1, m - 1])\) 它们全为偶度数结点。而对于 \(v_0, v_m\),由于 \(e_i\,(i \in [1, m])\) 包括了所有边,则当 \(v_0 \ne v_m\) 时,它们只有一个度数,当 \(v_0 = v_m\) 时,这个结点也是偶度数结点。
- 必要性
考虑 \(G\) 是一个连通的无向简单图,如果其没有奇度数结点则从任意结点出发,如果其有两个奇度数结点则从任意一个奇度数结点出发,开始构造一条欧拉路。
我们出发后进入一个偶度数结点,必然可以从一条未遍历的边出来,由于图 \(G\) 是连通的,如果有两个奇度数结点,则一定可以在不同于起点的奇度数结点停下形成一条迹 \(L_1\)。而全为偶数结点,则可以形成一条闭迹 \(L_1\'\)。
若此时 \(L_1\)(\(L_1\'\))包含了所有边,则我们就已经构造出来一条欧拉路。否则,考虑到除起点和终点外的点,其度数必为偶数,我们可以删去 \(L_1\)(\(L_1\'\)) 中所有边后,再删去剩下的孤立结点,得到子图 \(G\'\),由于原图连通,则我们必然能在 \(G\'\) 中找到一点使得其也在 \(L_1\)(\(L_1\'\)) 中,显然我们可以再通过同样方法在 \(G\'\) 中构造一条从该点出发的闭迹 \(L_2\),然后我们将 \(L_1\)(\(L_1\'\))和 \(L_2\) 合并为 \(L_3\),如果 \(L_3\) 包含了所有 边则构造完毕,否则我们可以继续像刚才一样,找子图构建一条新的回路,最终总能将所有边包括在内,即我们总能找到一条欧拉路。
这个证明其实比较显然,但是在这里列出来的原因是,发现如果我们只说明 \(L_1\) 和 \(L_1\'\) 是不足以结束证明的,必须要说明其可归约性。有时我们不能立刻构造出最优解,但我们可以通过证明其可归约性,从而说明运用这种方法一定能构造出最优解。简单来说就是证明一个算法保持循环不变式的过程(当然,前提可以认为是算法初始化的过程,结论也可以认为是算法终止后得到的运行结果所具有的性质)。
我们还可以由此推出存在欧拉回路的充要条件是所以的结点度数均为偶数。
类似地,我们将有向图中通过各条边恰好一次的路称为单向欧拉路,如果这条路为回路,则其为单向欧拉回路。我们也可以类比其得出单向欧拉路的充要条件,即每个结点出度等于入度或者存在一个结点出度比入度小 1,且另一个结点入度比出度小 1,且前一个条件也是单向欧拉回路存在的充要条件。
我们定义一个图如果存在一条路使得其可以不重复的经过图中所有结点,则称这条路为汉密尔顿路,若这条路为回路,则这条路为汉密尔顿回路。有哈密尔顿回路的图称为汉密尔顿图。
我们给出一个简单图为汉密尔顿图为充分条件:当图中任意两个结点的度数之和不少于 \(n - 1\),则存在一条汉密尔顿路,若不少于 \(n\) 则存在一条汉密尔顿回路。
其一个必要条件为,如果图 \(G = \langle V, E \rangle\) 中有一条汉密尔顿回路,则对于任意一个点集 \(S \subseteq V\),都有 \(W(G - S) \le \lvert S \rvert\)。
我们给出一个似乎不是特别好用的充要条件,在这之前我们介绍闭包的概念,对于图 \(G\),我们每一次选择一对结点度数之和大于图中结点数 \(n\) 的结点,让它们之间连边。直到无法操作,这时这个图就叫做图 \(G\) 的闭包,记作 \(C(G)\)。
有了闭包的概念,我们就可以给出这个充要条件:一个图是汉密尔顿图,当且仅当其闭包为汉密尔顿图。
看来我们学图论是从广度方面学习的,我们介绍平面图的相关知识,我们定义一个无向图如果存在另一个和它同构的图,且这个图的边没有在平面上相交,则这个图就为平面图。
我们将一个由图中边所围成的不含有边或结点的区域,称为图中的一个面。围成一个面的回路的长度,被称为面的次数。我们记一个平面图有 \(k\) 个面 \(F_1, F_2, \cdots, F_k\),且记其的次数为 \(D(r_i)\),则有:
对于平面图,我们有欧拉公式:
更一般的,如果其有 \(p\) 个连通分支,我们有:
有欧拉公式,我们可以引出一个推论:
对于一个连通的平面图 \(G = \langle V, E \rangle\),若对于图中任意一个面 \(r_i\),其次数 \(D(r_i)\ge k\),则有 \((k - 2) \vE \le k (\vV - 2)\) 成立。
考虑各面次数之和等于边数的 2 倍,且我们有 \(D(r_i) \ge k\),则有 \(k \vF \le 2 \vE\),即 \(\vF \le \frac{2} {k} \vE\)。而根据欧拉公式 \(\vV - \vE + \vF = 2\),我们可以知道 \(\vF = 2 - \vV + \vE \le \frac{2} {k} \vE\),则有 \((k - 2) \vE \le k (\vV - 2)\) 得证。
根据这个推论,我们还注意到对于一个连通的平面图,当 \(\vV = 3, \vE = 2\) 和 \(\vV = 3, \vE = 3\) 时,我们都有 \(\vE \le 3 (\vV - 2)\),而当 \(\vV > 3\) 时,由于图连通,我们有 \(\vE \ge \vV - 1 \ge 3\),而我们进一步发现,此时对于每个面来说,其次数必然不少于 3,代入推论也得到 \(\vE \le 3(\vV - 2)\),此时我们就又得到了一个结论:对于一个连通的平面图,当 \(\vV \ge 3\) 时,有 \(\vE \le 3(\vV - 2).\)
以上两个结论给出了平面图边数的一个上界且可以帮助我们判定一个图是否为平面图。
我们介绍库拉托夫斯基定理,我们首先考虑在图上,插入或删除一个度数为 2 的结点,不改变这个图的平面性。所以我们定义如果两个在插入和删除若干二度结点使得这两个图同构,则称这两个图二度同构。库拉托夫斯基定理则为:一个图没有和 \(K_5, K_{3, 3}\) 二度同构的子图,当且仅当这个图为平面图。证明过程比较长(并且似乎在网上似乎也找不到可以被笔者理解(指目前只找到一篇法语的论文)的证明)。
我们定义一个平面图 \(G = \langle V, E \rangle\) 且拥有 \(k\) 个面 \(F_1, F_2, \cdots, F_k\),若有一个图 \(G^* = \langle V^*, E^* \rangle\),其满足:
- 对于图 \(G\) 的任意一个面 \(F_i\),内部有且仅有一个结点 \(v^* \in V^*\);
- 对于图 \(G\) 中面 \(F_i, F_j\) 的公共边界 \(e_k\),在 \(G^*\) 中存在且仅存在一条边 \(e^*_k = (v^*_i, v^*_j)\),使得 \(e_k\) 与 \(e^*_k\) 相交;
- 当且仅当 \(e_k\) 仅为一个面 \(F_i\) 的边界时,存在一个环 \(e_k^*\) 使得其与 \(e_k\) 相交。
如果图 \(G\) 的对偶图与其本身同构,则称图 \(G\) 为自对偶图。
我们可以知道对于一个地图的着色问题,我们可以将其转化为其对偶图的着色问题,我们考虑定义图 \(G\) 的正常着色为图中结点的一组染色方案,其满足对于图中任意一组相邻接的结点的颜色不同。如果图 \(G\) 存在一个使用 \(k\) 种颜色的正常着色,则我们称图 \(G\) 为 \(\textit{k-}\)可着色的。我们将图 \(G\) 正常着色需要最小的颜色数定义为图 \(G\) 的着色数,记作 \(\chi(G).\)
由于图的 \(\textit{k-}\)着色问题为 NP 问题,所以目前没有多项式复杂度的算法。我们现在给出一种可以给出一种图的正常着色的算法(不一定用的是最少的颜色) —— 韦尔奇 \(\cdot\) 鲍威尔法:
- 将图 \(G\) 中的结点按照递减次序排列;
- 用第一种颜色对一号结点着色,并且按排列次序,对前面着色点不邻接的每一点着上同样的颜色;
- 用下一种颜色重复 2. 的操作,直到所有结点均被染色为止。
当然对于一些特殊的图,比如 \(n\) 个结点的完全图 \(K_n\),我们有 \(\chi(K_n) = n.\)
下面,我们来介绍一种特殊的图,树,其定义是不存在回路的无向连通图。当然我们可以证明,包括这个定义在内的以下 6 个定义是定价的:
- 无回路的无向连通图;
- 无回路且满足 \(\vE = \vV - 1\);
- 连通且满足 \(\vE = \vV - 1\);
- 无回路,但在增加任意一条边都会产生一条新的回路;
- 连通,但删去任意一条边都会使其不再连通;
- 任意两个结点都有一条且仅有一条路。
证明过于冗长,这里只提供一种证明思路为 \(1. \R 2. \R 3. \R 4. \R 5. \R 6. \R 1.\)
我们定义树中只有一个度的结点称为树叶(叶子结点),我们容易知道对于一棵树,其至少有两片树叶。
我们给出生成树的定义,如果对于一个图的生成子图,其为一棵树,则我们称这个子图为这张图的生成树。且容易证明连通无向图总是存在一棵生成树。
我们将生成树相对于原图的补图称为生成树的补,显然图中的任意一条回路必然存在一条边在一个生成树的补中。而对于图中的一个边割集,其和任何一个生成树至少有一条公共边。
由于不想过多介绍之前已经学过的 kruskal 求最小生成树的算法,所以这里直接跳(tou)过(lan)。
我们在前面都讨论的是无向图中树的概念,我们现在考虑有向图中树的概念,我们将一个有向图中的边,如果去掉方向其形成了一个无向图的树,则我们称这个图为有向树。若其中恰好仅有一个结点入度为 0, 则称其为根树(外向树),若其中恰有一个结点出度为 0,则称其为内向树。其中入度(出度)为 0 的结点称为根结点,相反的,出度(入度)为 0 的结点称为叶结点,除叶结点外其他所有结点称为内点或分枝点。
有根树中任一结点的层次定义为根结点到该结点通路的长度。如果 \(u\) 和 \(v\) 在同一条根到一个叶子的通路上时,且 \(u\) 的层次更大,则称 \(u\) 为 \(v\) 的后代结点或 \(v\) 为 \(u\) 的祖先结点。若 \(u\) 和 \(v\) 之间有一条边直接相连,则称 \(u\) 为 \(v\) 的子结点或 \(v\) 为 \(u\) 的父结点,如果两个结点由相同的父结点,则称这两个结点互为兄弟结点。
对于一个有根数,如果所有分枝点都有不超过 \(k\) 个子结点,则称这棵树为 \(k\) 叉树,如果所有分枝点的子结点个数均为 \(k\),则称这棵树为满 \(k\) 叉树。我们不难发现以下性质:
在满 \(k\) 叉树中,若树叶数为 \(t\),分支点个数为 \(j\),则有 \((k - 1)j = t - 1\)
证:由有向图所有结点入度之和等于边数可知,\(j + t - 1 = k \times j\)。移项可得结论。
为了方便,我们可以将一棵 \(k\,(k > 2)\) 叉树改成二叉树。我们改造的方法为,每个分枝点只保留一个最左边的子结点与其连通。再从最左边的子结点开始,向右将其兄弟结点用有向边连接,且依次作为一棵右子树的根。
我们称一棵二叉树带权是指其所有叶子结点都有权值 \(w_i\),我们定义根到 \(i\) 号叶子结点的通路长度为 \(L_i\),则一棵带权二叉树 \(T\) 的整体权值为 \(w(T) = \sum w_i L_i\)。对于叶子结点带权相同的二叉树,我们将权最小的一棵二叉树称为最优二叉树。
对于给定的一组叶子的权值 \(\{w_n\}\),我们考虑如何构造这组权值组成的最优二叉树。为了方便叙述,我们不妨设 \(w_i \le w_{i + 1}\,(i \in [1, n - 1])\),我们需要考虑一个贪心策略。我们通过交换论证,不难发现一定存在一种构造方式使得带权为 \(w_1, w_2\) 的树叶一定是兄弟结点,且以这两个树叶为子结点的分枝点一定为在二叉树中层次最大的分枝点。并且我们还可以知道对于一棵由 \(\{w_n\}\) 所构成的最优的二叉树,我们将 \(w_1, w_2\) 两个结点所在的叶子结点合并成一个权为 \(w_1 + w_2\) 的叶子结点的树,这颗新的二叉树仍为最优二叉树。
下面介绍二叉树的前缀码方面的应用,我们定义如果一个由 01 串组成的集合,且这个集合中任意一个 01 串的前缀(除了其本身)均不在这个集合中,则称这个集合为一个前缀码。容易发现如果我们构造某个字符集到前缀码一个双射,则用前缀码表示这个字符集组成的串可以避免二义性,且比传统计数表示节省了二进制位。
如果对于字典树的知识有了解,则很容易知道前缀码组成的集合到二叉树组成的集合的映射为一个双射。
由这种对应关系和通过反证法构造可知,给定前缀码所构成的二叉树的所有分枝结点度数为 2 时,那么这个前缀码才可以对任意一个 01 序列进行译码。
至此,图论的笔记就全部完结了。这一章对于我来说没有太多新的内容(这就是你在笔记上偷懒的理由?),主要是定义和证明的严谨化和规范化。当然也拓宽了视野,让我感受到除了算法竞赛中所讲的图论相关的算法,还有许多理论性的的东西等待我们去探索。