# Introduction of Graph Theory
- 从本节开始,我们将讨论图论中的一些知识。在开始之前,首先明确:图论在计算机科学中有什么用?
- 图(Graphs)适合用于将大数据(big data)及之间的关系抽象化(abstraction,即使用一个简单的模型提取复杂情况的本质)
- 图论对于进一步理解并应用归纳法有很大的作用。
- 在现实生活中,很多地方都存在图(当存在大量关系时也被称为网络network),比如互联网,地图,大脑的神经元网络,社交网络等……
- 图论可以解决许多问题:网页搜索推荐(Pagerank),染色问题,排线问题等。
- 目前公认的图论起源是1736年欧拉关于哥尼斯堡七桥问题的文章。他将陆地与桥的关系抽象为点与线,将七桥问题抽象为一笔画问题,使得对于问题的证明更加简单。(这也是拓扑学的起源)
# 正式定义
# 无向图(undirected graph)
- 对于一个(无向)图而言,它包含两个集合:顶点集和边集。顾名思义,顶点集包含图里的所有顶点,而边集包含图里的所有边。
- 以下图为例:

在这张图中,, - 当然,实际上实际上可以有重复的元素(如上面的七桥问题就是),但为了方便起见,我们不考虑重复元素的情况,将视为集合。
# 有向图(directed graph)
- 在无向图的基础上,我们还可以规定每条线的方向(起点与终点),这样就得到了有向图。图例如下:

则在这张图中,, - 这里是的子集(回顾:)
- 注意到,在有向图中,如果,那么。相应的,如果且,则对应的图为无向图。这是我们用作为的元素。
- 将和归结,我们将图(包括无向图与有向图)定义为。
# 相邻点(neighbours),度(degree)与自环(self-loop)
- 当两个顶点之间有边直接相连,则称两个顶点为相邻点,这样的边则被称为邻边。
- 如果为一个无向图,则图中顶点的度为与相连的边的数量,即
- 如果的度为,则称为孤立顶点(isolated vertex)。
- 如果为有向图,那么图中每个顶点都会有两个度:入度(in-degree) 和出度(out-degree)。入度是指向的边的数量,而出度是从指出的边的数量。
- 自环是指在图中起点与终点均为同一点的边(或)。一般而言,自环不会提供额外的信息,所以除非特别说明,我们默认图没有自环。
# 路径(path),线路(walk),环(cycle)与回路(tour或circuit)
- 假设为无向图。则一条路径可以被表示为一系列边的序列(如,到两两不同,此时我们称和之间存在一条路径)。这里的路径要求不重复经过同一个顶点,所以也称为简单路径(simple path)。
- 如果路径的起点与终点为相邻点(即存在),那么路径加上起点与终点相连的边构成了一个环。此时就只记录环的起点。
- 如果从和,允许有重复经过的顶点,那么这样的边序列被称为线路。
- 类似环与路径的关系,如果允许环中有重复经过的顶点,那么就称为回路。
- 特别地,如果一条线路恰好包含了图的所有边一次,那么就称为欧拉线路(Eulerian walk);如果一个回路恰好包含图的所有边一次,就称为欧拉回路(Eulerian tour或Eulerian circuit)。
# 连通性(Connectivity)
- 连通性是图论中的一个重要概念。如果一个图中任意两个顶点之间都存在一条路径,那么就称这张图是连通的。
- 对于不连通的图,如果它的部分节点组成的图连通,那么就将这些节点的集合称为连通分量(connected components)。任何无向图都可以分解为若干个连通分量的组合。
- 对于有向图,情况更加复杂,这里不做讨论。
# 解决七桥问题:欧拉定理
- 七桥问题可以抽象为以下的形式:给定一个无向图,是否存在一个欧拉回路?为引出下面的欧拉定理,我们补充一个定义:
- 偶度图(even degree graph):图中的每一个顶点的度数均为偶数。
# 欧拉定理及其证明
- 欧拉定理(Euler’s Theorem):无向图具有欧拉回路当且仅当为偶度图且连通(除了可能的孤立点)。
为了证明这个定理,我们需要从两个方向进行证明(即充分性与必要性):
# 充分性证明
即:无向图具有欧拉回路为偶度图且连通。
- 我们可以使用直接证明法:
- 首先是连通性。由于具有欧拉回路,所以的每一个有邻边的顶点都包含在回路内,因而除孤立点外,其他所有顶点都在回路内,即除孤立点外连通;
- 然后证明每个顶点的度数为偶数。注意到在欧拉回路中,每一个顶点(除起点外)都通过一条邻边访问到,再通过另一条邻边离开,这两条邻边可以组成一个配对。而对于起点而言,由于回路最终还是回到起点,所以可以将起始的边与结束的边配对。这样图中每一个顶点的邻边都能被配对,即度数为偶数。
# 必要性证明
即:无向图为偶度图且连通具有欧拉回路
- 我们使用递归与归纳法证明:
- 定义函数,尝试在中寻找一个回路(不一定是欧拉回路)。具体而言,它会以顶点为回路起点,不断寻找一条与当前顶点相连接且未被遍历的边,并将当前顶点更新到这条边的另一端,直到无法再找到与当前顶点相连接且未被遍历的边为止。
- 下面证明最终一定会在顶点停止。由归纳可得遍历过程中任意顶点,在抵达时被遍历的邻边数量一定为奇数。而又因为图中每一个顶点的邻边数量为偶数,所以至少会有一条未被遍历的邻边,即不会在顶点停止。所以最终只能在顶点停止。
- 我们设返回值为其遍历到顶点所经过的回路(不一定是欧拉回路)。
- 现在设计一个算法,目标是使其返回从顶点出发得到的一条欧拉回路;再定义一个操作,其中均为的一个连通分量,且与各有且只有一个公共顶点(这些顶点互不相同),两两之间没有公共顶点。
示意图如下:
的输出为一个简单回路,它将通过串联在一起。
- 现在设计一个算法,目标是使其返回从顶点出发得到的一条欧拉回路;再定义一个操作,其中均为的一个连通分量,且与各有且只有一个公共顶点(这些顶点互不相同),两两之间没有公共顶点。
- 接下来我们对的大小进行归纳。这里我们使用的指标为的边数。
- 初始条件:时,为空,所以没有回路。
- 归纳假设:可以为任何边数不超过的连通偶度图构造欧拉回路。
- 归纳步骤:
假设有条边。那么由于可以找到一条回路,现在中属于的边去掉,剩下的部分可以被分为若干个连通分量(这些连通分量的边数不超过)。而因为和的每个节点都有偶数条邻边,所以去掉后剩下的所有节点仍然有偶数条邻边,则由归纳假设,对于每个连通分量,存在欧拉回路。将设置为与的公共顶点,则通过操作,可以将中的所有边都遍历到,因而构成了欧拉回路。
# 平面性,欧拉公式与染色问题(Planarity, Euler’s Formula, Coloring)
# 树(Trees)
- 这里我们简要给出树的定义:树是一种连通且无环的图。(可以证明:在含有环的无向连通图中,删除环的任意一条边,图的连通性都不会被破坏。)
- 树也有一些等价定义:如顶点数大于边数的图,删除任意一条边都会破坏连通性的图等。(也可以证明:有个顶点的树有且仅有条边,这些证明过程都将在后续详细给出)
# 平面图(Planar graphs)
- 如果一个图可以在平面上画出,且没有交叉的边,那么它就被称为平面图。如下图所示,这些图都是平面图(中间的虽然有交叉边,但可以转化为右边的形式):

- 而下面这些图都不属于平面图:

其中左上图也被记为(即顶点分为两个各含个顶点的子集,同一子集内任何两点都不相邻(没有边相连),不同子集合内任何两点都相邻(有边相连));正上方的图被记为(含有个顶点的完全图);右上方的图是一个超立方体的拓扑图。 - 特别地,我们将形如的图称为二分图(bipartite graph)。则右上方的超立方体拓扑图也属于二分图。
关于这些图的平面性及非平面性证明将会在后续给出。(注:此处给出的图像只是图的一种表现形式,实际一张图的表现形式不唯一) - 对于平面图,除了可以确定它的顶点数和边数外,还可以确定它的面数(记为,即平面图划分出的区域,其中一个是无限区域,其他均为有限区域)。比如,上述平面图中第一个的面数,第二个和第三个的面数均为。
- 由此,我们可以引出下面这个重要公式:
# 欧拉公式:
- 早在古希腊时期,人们就已经在多面体上发现了这一规律,但无法证明它。而在18世纪,欧拉发现这一规律无法直接使用多面体进行归纳证明,需要将多面体推广为平面图。
- 下面我们就证明:对于任意平面连通图,有。
- 尝试在边数上进行归纳。当时,和都只能为,公式显然成立。
- 如果这个平面连通图是树,那么有,(后续会证明);
- 如果这个平面连通图不是树,那么它就存在环。对于每一个环,删去环中任意一条边,那么这个图的边数和面数会同时减。重复这一过程直到图中没有环,那么就与树的情况相同。由树的情形满足得到非树情形也满足。
- 证明完成。
- 接下来我们进一步探讨平面图中和的关系。对于平面图中的每一个面,记它以顺时针得到的所有界边数为。那么,因为图中的每一条边都被计算两次(一条边的两侧各被计算一次),所以有以下等式:
又注意到,平面图中任意两点间都只有一条边,另外我们假设图中至少有两条边(即至少三个顶点),那么每个面都至少有三个界边(即)。综合前面的等式,我们得到:。将不等式代入欧拉公式中,即得:
这告诉了我们一个重要结论:平面图是 稀疏(sparse) 的,在顶点数确定的条件下,边数存在限制。特别是当比较大时,和理论最大边数相比就小了很多。
- 利用这个判定不等式,我们可以得到不是平面图,但还不能证明不是平面图。对此,我们可以用更严格的限制条件:对于形式的图,不应该存在封闭的三角形(如果存在则与两个点集各自没有边连接矛盾),于是可得,平面图条件可加强为,而的边数为,最终得到不是平面图。
- 实际上,对于图的非平面性判定,有以下著名的定理:
库拉托夫斯基(Kuratowski)定理:对于一个图,它是非平面图当且仅当它包含同胚于和的子图。(这两个就是源自Kuratowski)
如上面的超立方体的拓扑图,它就包含了的同胚子图,因此它就不是一个平面图。(关于同胚的概念暂时不细究,可以理解为两个图可以通过一定方式互相转换,而不改变其根本结构) - 关于定理的证明,这里不详细展开(实际上,必要性的证明非常显然(即当一个图包含同胚于和的子图,那么它必然不是平面图),而充分性的证明则比较困难,可以参考以下文档:Proof of Kuratowaki' Theorem)
# 对偶与染色(Duality and coloring)
# 对偶图
- 同样,早在古希腊,人们就发现正多面体之间存在一些对偶性:如正八面体(octahedron)与立方体(cube)互为对偶(一个正多面体的面对应另一个正多面体的点),正四面体与自身对偶,如下图(出自开普勒《宇宙和谐论》,图源维基百科):

- 我们尝试用图论中的概念解释这种现象:
取一个平面图,要求它没有度数为的顶点以及两侧均为同一面的边。接着画一个新的图——先在每个面内取一个顶点,然后对所有有公共边的两个面对应的两个顶点用边连接。可以得到也是一个平面图,也称为的对偶图。对再进行上述操作,会得到:。 - 可以证明:所有连通的平面图都具有对偶图(也包括有度数为的顶点或有两侧均为同一面的边的图,但证明比较复杂,再此不赘述)。这一性质可以得到一个重要的等价性推论:
“对一个地图进行染色,要求有公共邻边的图不同色” 与 “对一个连通平面图的顶点进行染色,要求相连的顶点不同色” 等价。(注:之后笔者会用“地图”代表对面进行染色的图,以便和对顶点进行染色的图进行区分)
# 染色问题
- 我们再使用上面提到的二分图(bipartite graph)的概念,可以得到以下结论:对于一个可以用两个颜色染色的地图,它等价于一个二分图(这很显然,因为对于二分图,我们对两个点集分别染上不同的颜色即可)。
- 由此我们还可以得出:含有奇数条边的环的平面图一定不是一个二分图。下面证明:
- 取图中任意一顶点,以为中心,向外染色:的相邻点染成红色,它们的未染色相邻点然成蓝色,以此类推;
- 如果无法完成染色问题,则说明有相邻的点被染成了同一种颜色(设为顶点和)。
- 那么可以将,,看成一个环。由于和被染成一种颜色,说明和两个边数的差必为偶数(那么和也为偶数)。再加上的一条边,这个环的边数就为奇数。
- 证明完成。
- 对于染色问题,著名的“四色定理”证明了任意平面图都至多只需要四种颜色染色。这里我们证明一个稍弱一点的命题:
- 五色定理:任意平面图都可以被五种颜色染色。
- 在证明之前,首先给出一个结论:在平面图中任意选取只由两种颜色染色的点集(要求构成一个连通分量),将它们的颜色互换仍然构成一个合法染色方案。
- 接下来我们对顶点数进行归纳证明:
- 初始条件无需赘述(可自行构造证明),归纳假设即为顶点数为时五色定理成立;
- 对于一个平面图,可以证明它一定存在一个度数不超过的顶点(因为如果所有顶点度数都大于,那么就与不等式矛盾);
- 于是我们假设顶点的度数不超过。如果它的度数不超过,那么可以在去掉构成的平面图的染色方案的基础上对染上与它邻点均不同的颜色(第五种颜色)即可;
- 下面我们讨论的度数恰好为的情况。假设它的五个相邻点为(按顺时针标记),分别被染成颜色。
于是,如果和之间不存在一条只由和构成的路径,那么就可以将染成,而将留给;
同理,如果和之间不存在一条只由和构成的路径,那么就可以将染成,而将留给;
如果和之间存在一条只由和构成的路径,且和之间也存在一条只由和构成的路径,那么由平面性可知这两条路径必然在一个顶点相交(如下图所示),这导致这个顶点的颜色无法确定(),故不会产生这种情况。

- 证明完成。
# 一些重要类型的图:树、完全图和超立方体图
- 这里我们将讨论一些在实际应用中非常有用的图。
# 完全图
我们前面已经接触到了完全图(),下面对完全图进行正式定义:
- 在完全图中,任意两个顶点之间均有边相连,所以在给定顶点数的条件下,完全图是唯一的(记为)。于是我们可以写出:
- 经过计算可知,完全图的边数为。而要破坏它的连通性,至少需要删去条边(即将一个顶点的所有领边删去)。
- 当然,我们也可以定义完全有向图:对于有向图中的任意两个顶点和,。
# 树
重新回到树的讨论中。如果说完全图是一个极端(边数最多)的话,那么树可以看作是另一个极端——满足连通性条件下边数最少的图。
- 之前提到,对于是树,存在一些等价定义,列举如下:
- 为连通无环图;
- 连通且有条边(其中);
- 连通,且删去中任意一条边都会破坏的连通性;
- 无环,且增加任意一条边都会构成一个环。
# 有根树(rooted tree)与无根树(unrooted tree)
- 就像现实中树的结构一样,我们引入“有根树”的概念。如下图所示:

- 在有根树中,存在一个根节点(root),它位于树的顶部。处于树最底部的节点被称为叶节点(leaves)。剩下的处于中间位置的被称为内部节点(internal nodes)。
相对的,无根树就没有根节点的定义,所有度数为的节点都为叶节点。(可以用类比有向图与无向图的关系,有根树确定了节点间的“父子”关系,就像有向图一样,而无根树就类似无向图) - 另外,在有根树中,定义其深度(,depth)为根节点到叶节点之间的最远路径长度。由此,可以定义有根树中每一个节点所在的层(,level),即根节点到此节点之间的路径长度()
- 有根树在研究一些问题时非常有用,比如细胞分裂,遗传图谱,快速搜索(二分搜索树)等。
# 树的性质
我们使用归纳法证明上述树的前两个定义等价:为连通无环图连通且有条边(其中)
- 先证明:为连通无环图连通且有条边
- 初始条件:时,只有一个节点,没有边,显然成立。
- 归纳假设:假设命题在时成立。
- 归纳步骤:
- 现在令。在中任意删去一个节点和与相连的边,得到一个新的图。显然是无环的,但它不一定连通。
- 如果是连通的,那么由归纳假设,它有条边。现在将加回来,那么最多只能增加一条边(因为如果增加更多的边,就说明与中多个点相连,构成环,与条件矛盾)所以最终得到的边数为。
- 如果不连通,那么一定由若干个连通分量构成(设为,每个连通分量的节点数为)。因为这个连通分量均无环,故由归纳假设,这个连通分量的边数和为。现在将加回来,那么为了使连通且无环,只能分别对这个连通分量中取一点相连。最终得到的边数为。
- 归纳证明完成。
- 当然,对于这个命题,还有另一种比较简洁的归纳方法:由于是一个连通无环图,在图中取一条最长的简单路径,则可以断定的度数为(如果不然,那么存在边,且不在这条路径上,则可构成一条更长的路径,产生矛盾)。将删去,得到一定是连通无环图。接下来就和上述连通情况相同了。
- 再证明:连通且有条边为连通无环图
- 使用反证法证明:假设连通,有条边,且有环。那么,根据环的定义,删去环中任意一条边都不会破坏图的连通性,所以我们得到了新的只有条边的图。然而,必然不连通(证明见下),因而产生矛盾,原命题成立。
- 为什么有个点与条边的图一定不连通:
- 我们先证明一个引理:含有个点与条边的图至少会有个连通分量。
- 使用归纳法证明:
- 当时,命题显然成立。
- 假设时命题均成立,现在令。因为在图中加入一条边后,连通分量的数量要么不变(连接的两个点属于同一个连通分量),要么减(连接的两个点属于不同连通分量)。因而由归纳假设,含有个点与条边的图至少有个连通分量。
- 归纳证明完成。由此,带入得,含有个点与条边的图至少会有两个连通分量,即不连通。
- 证明完成。another art of induction
# 超立方体(图)
在现实生活中,构建通信网络由于需要保证稳定性并防止“瓶颈”(两个连通分量间只有一条边相连),需要大量节点之间的强连接。如果使用完全图的形式,那么就需要大量连接线,成本过高。为解决这一问题,工程师们使用了超立方体构建网络,大大降低了成本。
# 定义
- 对于维超立方体,我们将点集进行二进制编码:,即每一个点均为一个二进制串。而对应的边集定义为:(即相邻的顶点有且只有一位二进制码不同)
- 当然,我们也可以用递归的方式进行定义:
- 首先定义“0-子立方体”和“1-子立方体”:前者中所有顶点编码形式为(),后者对应为()。接着将“0-子立方体”与“1-子立方体”中对应的点(即序列相同的点)相连接,就构建出维超立方体。
# 超立方体的性质
- 维超立方体的顶点数为(显然由二进制码定义即得)。
- 维超立方体的边数为。
- 证法1:对于超立方体的每一个顶点,它都有个相邻点(由其二进制码每一位各自变化构成),所以类似完全图,总边数为
- 证法2:由超立方体的递归定义可知,设维超立方体的边数为,有。又因为,故可归纳得出。
- 超立方体具有良好的连通性(不像树那样破坏连通性只要删去一条边)
- 这里我们证明以下命题:
将维超立方体的顶点集分为和,并假设(即的顶点数不超过)。记连接和的边集为(即),那么有。 - 我们使用归纳法证明:
- 初始条件:时,一维超立方体图中有两个点和一条边。,所以或。时显然成立,时可为或(对应为或),那么,命题成立。
- 归纳假设:假设命题对任意成立。
- 归纳步骤:令。我们将点集分为两个集合:,属于维超立方体的“0-子立方体”,属于维超立方体的“1-子立方体”。接着我们进行分类讨论:
- 情况1:且
这样对每个子立方体,满足归纳假设,故至少有条边连接和它在“0-子立方体”上的补集(同理)。所以将两个子立方体加起来,得到和之间相连的边数至少为,命题成立。 - 情况2:
这里我们就不能直接对套用归纳假设,但是我们可以对和(这里是“0-子立方体”的全体点集)套用归纳假设(因为),即得:至少有条边连接和它在“1-子立方体”上的补集,且至少有条边连接和它在“0-子立方体”上的补集(即)。
另外,我们再考虑连接两个子立方体且属于的边。由于每一个“0-子立方体”里的点都和“1-子立方体”里的点相连接,所以可以得到至少有条属于的边将两个子立方体连接。由此可得,命题成立。
- 证明完成。
- 这里我们证明以下命题:
