上一章把一整列计数装进生成函数,又把计数放进样本空间变成概率。现在我们换一个问题:对象之间怎样连接?
这一步看起来像换了学科,其实前面练过的工具都还在。集合用来装顶点和边,二元关系可以直接画成有向图,双计数会变成握手定理,等价关系会把图切成连通分量,归纳法则会在“删一条边,再把它加回来”时反复出现。图论不是把这些内容放下,而是给它们一个共同的活动场地。
图论最容易让人误会的地方,是图画得太直观。点摆在哪里、线画得长还是短,往往都不重要;真正被保留下来的,是“哪些对象被当成顶点,哪些顶点之间有边”。因此,学这章时别急着看图像不像地图,先把两个问题说清楚:
只要这两句话没有说清,后面的度数、路径和连通性都没有确定含义。

本章默认讨论有限图。没有特别说明时,“图”指有限简单无向图;一旦允许方向、平行边或自环,我们会明确写出图的类型。
一个无向图通常写成
是顶点集合, 是边集合。若 ,无向边写成 。它是一个二元集合,所以
这正好表达“方向不重要”。城市 与城市 之间有双向道路,和城市 与城市 之间有双向道路,说的是同一条连接。
图的顶点数 常叫图的阶,边数 常叫图的大小。为了少写符号,也常记
数学上,一张图的全部信息就在 和 里。把同一批顶点拖到别的位置,把直线画成曲线,甚至让两条边在纸面上交叉,都不会改变这两个集合。
把现实问题翻成图时,可以按下面的顺序检查。
先选顶点。顶点应对应需要区分的对象。排课问题里可以是一门门课程,地铁问题里可以是一座座车站,网页问题里可以是一张张网页。
再写一句完整的边规则。例如“两个顶点之间连边,当且仅当两门课有学生同时选修”。“当且仅当”会迫使我们同时说清什么时候连、什么时候不连。
判断关系是否有方向。“互为同学”通常没有方向,“网页甲链接到网页乙”却有发出端和接收端,不能把箭头省掉。
判断是否要保留重复连接和自连接。如果只关心两站是否相邻,一条边就够;如果要把两站之间的不同线路分别记录,就可能需要平行边。
例如,把课程看成顶点,当两门课不能安排在同一考试时段时连边,就得到冲突图。这个模型里边是对称关系,所以用无向图。把课程先修要求建模时,若课程 必须先于课程 修读,就画箭头 ;方向在这里是问题的一部分。
简单无向图满足两条限制:
因此,简单图的边集合可以写成
多重图允许同一对顶点之间有多条平行边。不同课程对“多重图”是否允许自环的约定并不完全一致,所以遇到多重图时,应把“能否有自环”单独说明。地铁站之间有两条不同线路、两台服务器之间有多条独立电缆,都适合用平行边保留连接的重数。
有向图的边是有序对。箭头
从 出发,在 结束。一般来说,
前面学过二元关系以后,有向图其实很熟悉:定义在 上的二元关系就是 的一个子集,而这恰好可以看成一组从一个顶点指向另一个顶点的箭头。

纸面上两条边相交,不会自动产生顶点。只有被明确标成点并列入 的对象才是顶点。桥梁立交图中的两条道路可以在图上交叉,却并没有可以转向的路口。
有向图中,一个顶点有两种度数:
一条有向自环从 发出又回到 ,所以它给 和 各贡献 。
把所有顶点的入度相加,每条箭头会在自己的箭头端被数一次;把所有顶点的出度相加,每条箭头会在自己的箭尾端被数一次。因此
这和后面无向图的握手定理是同一个双计数思想,只是无向边有两个不分方向的端点,而有向边有一个箭尾和一个箭头。
某城市要研究地铁网络。若把车站当作顶点,应怎样定义边?
答案取决于问题。若只问“两个车站之间是否有一段直达区间”,可以在相邻车站之间连无向边。若上下行都存在但只关心可达性,仍可用无向图。若某些区间只能单向运行,就要用有向图。若两站之间有两条线路,而我们想分别记录每条线路,就要用多重图。
这里没有脱离问题的“唯一正确画法”。正确模型的标准,是它保留了回答目标问题所需的信息,又没有塞进无关细节。
若简单图中有边 ,就说顶点 与 邻接。也说边 与它的两个端点 关联。
“邻接”描述顶点和顶点的关系,“关联”描述边和顶点的关系。这两个词很像,但对象不同:
图画得再复杂,这两类关系仍由边集合准确决定。
设 与 是两个简单图。如果存在一个双射
使任意 都满足
就说 与 同构。
这一定义可以读成一句人话:把顶点重新命名以后,边与非边都完全对得上。图的几何外观可以改变,连接结构不能改变。
第一次判断同构时,很多人会盯着图旋转。更稳的思路是先找不变量,也就是同构后一定保持的性质:
例如,一个图的度数多重集是
另一个图的度数多重集是
它们不可能同构。这个结论不需要尝试任何顶点配对,因为同构会保持每个顶点的度数。
反过来,度数序列相同还不能保证同构。度数只是结构的一张“摘要”,不同连接方式可能产生同一张摘要。要证明两个图同构,最终仍要给出一个保持邻接的双射;要证明不同构,只需找到一个被同构保持、但两图取值不同的性质。
有些连接结构会反复出现,所以有固定名字。
完全图 有 个顶点,每对不同顶点之间都有边。每个顶点的度数都是 ,边数是
这个公式既可以用组合数理解:从 个顶点中选两个作为边的端点;也可以等到握手定理后再算:度数总和是 ,每条边被数两次。
空图有顶点而没有边,因此每个顶点的度数都是 。不要把空图和空集混在一起:一个有 个顶点的空图仍有 个顶点,只是边集为空。
路径图 把 个顶点排成一条链。 时,两端顶点度数为 ,中间顶点度数为 ,边数为 。
圈图 把 个顶点首尾接成一个圈,其中 。每个顶点度数为 ,边数为 。
这些名字说的是同构类型,不是在规定画法。 可以画成正五边形,也可以画成一条扭曲的闭合线;只要邻接关系相同,它们就是同一个结构意义下的圈图。
若
满足
并且 中每条边的端点都在 中,就说 是 的子图。删掉顶点时,与它关联的边也必须删掉;不能留下没有端点的边。
若子图保留原图全部顶点,即
就叫生成子图。它只从原图中删边。下一章的“生成树”正是这种对象:顶点一个不少,只挑出足以维持连通的一部分边。
还有一种常用选择叫诱导子图。给定顶点子集 ,诱导子图 不但保留 中的顶点,还要保留原图中两个端点都在 内的所有边。普通子图可以少选边,诱导子图不能随意漏掉 内部原本存在的边。

图论研究的是被同构保持的结构。边的长短、顶点的坐标、图形是否对称通常不是图论性质;度数、路径、回路和连通性才是。
在简单无向图中,顶点 的度数 是与 关联的边数。因为简单图没有自环和平行边,它也等于与 邻接的顶点数。
这两个说法在多重图中不能随便互换。若 与 之间有三条平行边, 只多了一个邻接顶点,却多了三条关联边。若允许自环,则一个无向自环在同一顶点上有两个端点,所以按标准约定对该顶点的度数贡献 。
没有任何关联边的顶点叫孤立顶点,度数为 。只有一条关联边的顶点常叫叶顶点,度数为 ;下一章研究树时,叶顶点会频繁出现。

下面的工具可以切换路径图、圈图、星图和完全图,也可以自己添加或删除边。每改一条边,先预测哪两个度数会变化,再看统计结果。
设 是有限无向图。把所有顶点的度数相加,得到
这叫握手定理。公式并不神秘,它只是在用两种方式数同一批“边端”。
固定一条普通边。它有两个端点,所以会在两个端点的度数中各贡献 。
因而每条边对度数总和贡献 。如果允许无向自环,它的两个端点都落在同一顶点上,仍贡献 。

握手定理也是一次典型的双计数。前面的组合计数中,我们常通过“先选谁、再选谁”数同一批对象;这里改成“从边看端点”和“从顶点看关联边”,方法没有变。
握手定理右边是偶数,所以度数总和必为偶数。偶度顶点的度数相加仍为偶数,于是奇度顶点的度数之和也必须是偶数。
奇数个奇数相加是奇数,偶数个奇数相加是偶数。因此:
这个结论比公式本身更常被拿来快速排除不可能情况。比如有人声称一张图恰好有 个奇度顶点,我们不用知道图怎样画,就能断定它不存在。
下面的验证器会逐条加入边。注意每次加边时,两个端点的奇偶性都会翻转:偶数变奇数,奇数变偶数。奇度顶点的个数可能增 、减 或不变,但不会从偶数变成奇数。
若 ,图的平均度是
代入握手定理得到
因此知道顶点数和平均度就能恢复边数。例如,某简单无向图有 个顶点,平均度为 ,那么
平均度不必是整数,因为它是全体顶点度数的平均值,而不是某个实际顶点的度数。
考虑度数序列
总和为 ,违反握手定理,所以它不可能来自任何无向图。
但“总和为偶数”只是一条必要条件,并不足以保证一个序列能画成简单图。例如,四个顶点的简单图里,任何顶点的度数都不超过 ,所以
虽然总和是 ,仍不可能成为四顶点简单图的度数序列。
看到度数序列时,握手定理适合快速筛错,却不是完整判定法。还要检查每个度数是否落在允许范围内,以及这些局部要求能否同时实现。
练习:一个简单无向图有 个顶点,其中六个顶点的度数分别是 。最后一个顶点的度数可能是 吗?
一条边只告诉我们能不能直接走一步。要描述从一个顶点经过若干条边到另一个顶点,就需要一串顶点和边。
严格地说,一条长度为 的走法,也常叫游走,是交替序列
其中每条 都连接相邻的 与 。在简单图中,相邻顶点唯一确定边,所以常把它简写成
长度数的是走过的边,不是写出的顶点。因此这条走法的长度是 ,而顶点在序列中出现了 次。
中文术语在不同课程中会有细微差异,本章固定采用下面的约定:
简单无向图中的圈长度至少为 。沿同一条无向边走过去再走回来,虽然得到长度为 的闭走法,却把同一条边用了两次,不是闭迹,也不算圈。

为什么要把术语分这么细?因为不同问题禁止的重复不同。送货员可以再次经过同一个路口,却可能要求每段道路只检查一次;这要找的是迹。若要求途中不回到任何旧地点,才是在找简单路径。
设简单图的边集是
逐个看下面的序列。
判断时不要靠“看起来绕不绕”。直接写出边序列,检查边有没有重复;再写出顶点序列,检查顶点有没有重复。
有向图中的走法必须沿箭头方向。若有
却没有
那么这条边允许从 走到 ,不允许从 走回 。所以有向图里“从 能到 ”一般不能推出“从 能到 ”。
这也是有向路径和无向路径最根本的区别。网页链接、任务依赖和单向交通都不能随意把边反过来用。
如果从 到 存在一条走法,那么从 到 一定存在一条简单路径。
第一次看到这句话,容易觉得它只是“把多余绕路删掉”。这个直觉是对的,但我们把删法说严密一点。
在所有从 到 的走法中,选一条长度最短的。有限长度组成的非空自然数集合一定有最小元,所以这一步有保证。
假设这条最短走法重复经过某个顶点 。从第一次到达 到下一次到达 的那一段是一个绕回 的闭走法。
这段证明值得记住的不是结论本身,而是“取最短对象,再说明它不可能含有冗余”。以后证明最短路、最小反例和极小结构时,这个套路会反复出现。
证明“存在从 到 的路”,给出一条具体路径就够了。证明“不存在”却不能只说“我没找到”;通常要指出一个把顶点分开的切口,或证明两点属于不同连通分量。
在无向图中,如果从 到 存在一条路径,就说 与 连通。每个顶点都通过长度为 的路径与自己连通。
如果图中任意两个顶点都连通,就说整张图连通。注意,“连通”不要求两点之间直接有边,只要求经过若干条边能到达。
一张图可以边很多却不连通。例如,两个互不相连的完全图各自都很稠密,合在一起仍有两个分开的部分。反过来,一条很稀疏的长链只有 条边,却是连通图。

连通分量是极大的连通子图。“极大”不是说它的顶点数比别的分量都多,而是说它已经无法再从原图加入一个新顶点而保持连通。
更自然的理解来自前面学过的等价关系。在无向图的顶点集合上定义
这个关系满足:
自反性: 到自己有长度为 的路径,所以 。
对称性:无向路径可以反向走,所以 能推出 。
因此, 是等价关系。它的等价类正是连通分量。前面“等价关系会把集合划分成互不重叠的块”,到了这里就变成“可达性把顶点集合划分成连通分量”。
孤立顶点也单独形成一个连通分量。它和自己连通,却与任何其他顶点都不连通。
下面的工具可以切换连通图、两个分量以及含孤立顶点的图。选择起点和终点时,先判断它们是否在同一分量,再看工具给出的路径。
有向图中,“从 可达 ”仍有自反性和传递性,却通常没有对称性,所以单向可达本身不是等价关系。
若有向图中任意两个顶点 都同时满足
就说有向图强连通。也就是从任一点都能沿箭头到达任意另一点,并且还能沿某条有向路径回来。
若先把所有箭头方向擦掉,得到的无向图连通,就说原有向图弱连通。弱连通只保证忽略方向以后不分裂,并不保证实际能顺着箭头往返。
把“互相可达”定义成关系:
它是等价关系,对应的等价类叫强连通分量。
若 与 连通,定义它们的距离为所有 到 路径中最短的长度:
在无向图中,距离满足三个熟悉性质:
以及三角不等式
三角不等式的想法很直接:先走一条从 到 的最短路,再走一条从 到 的最短路,拼起来得到一条从 到 的走法。真正的最短路不会比这条指定走法更长。
若 不在同一连通分量,最短路径不存在。有的课程把 留作未定义,有的把它记成 ;使用前要说明约定。
有向图的距离按有向路径定义,因此可能
甚至一个方向有有限距离,反方向完全不可达。
一个有 个顶点的连通图至少有 条边。我们可以把证明看成一次“逐步扩张”。
从任意一个顶点开始,把它放入集合 。只要 还没有包含全部顶点,由于图连通,必有一条边从 内连向 外;否则 内的顶点永远走不到外面。选这样一条边,把它的外部端点加入 。
每加入一个新顶点,至少要选一条新边。最初已有 个顶点,要扩张到 个顶点,一共要加入 次,所以至少需要 条边。
这个证明还悄悄留下了一组特殊的边:它们连起全部顶点,而且每一步只接入一个新顶点,没有制造多余绕路。下一章会把这种“刚好够连通”的结构正式叫作生成树。
练习:一个无向图的顶点集是 ,边集是
写出所有连通分量,并求 与 。
图论早期最有名的问题来自一座被河流分割的城市:能不能找一条路线,把七座桥每座恰好走一次?
真正的突破不是更耐心地试路线,而是把陆地缩成顶点,把桥缩成边。这样一来,问题中道路的弯曲、桥的长度和城市的实际比例都被删掉,只剩下“每座桥连接哪两块陆地”。这正是图模型擅长保留的信息。
把图中每条边恰好使用一次的迹叫欧拉迹,也常叫欧拉路径。若起点和终点相同,就叫欧拉回路。
这里的“恰好一次”针对边,不是顶点。欧拉迹可以多次经过同一个顶点,只要不重复边。另一个容易混淆的问题是“每个顶点恰好经过一次”,那是哈密顿路径问题,限制对象完全不同。
假设一条欧拉迹经过某个既不是起点也不是终点的顶点 。每次沿一条边进入 ,都必须再沿另一条还没用过的边离开。于是,迹在 使用的边会自然地两两配对:
欧拉迹使用了图中每一条边,所以 的全部关联边都要配完。能完全配对意味着
起点和终点稍有不同。若起点与终点不同,起点会多一次“离开而没有对应进入”,终点会多一次“进入而没有对应离开”。它们各留下一个不能配对的边端,所以这两个顶点的度数是奇数。
这就解释了奇度条件的来源:
握手定理早已告诉我们奇度顶点总成偶数个;欧拉迹的进出配对又把可能性进一步压到 个或 个。
只看度数不够。两个互不相连的圈中,每个顶点度数都是 ,却不可能用一条连续路线走完两个分量的全部边。
精确条件要忽略没有边的孤立顶点,因为欧拉迹的任务是覆盖边。对一个至少有一条边的有限无向图:
图存在欧拉回路,当且仅当所有度数非零的顶点位于同一连通分量,并且每个顶点的度数都是偶数。图存在起终点不同的欧拉迹,当且仅当所有度数非零的顶点位于同一连通分量,并且恰好有两个奇度顶点。
把两种情况合起来说:边所在的部分必须连通,奇度顶点个数必须是 或 。
“有欧拉回路,所以每个度数为偶数”只证明了必要性。要得到完整定理,还要说明:边所在的部分连通、所有顶点度数为偶数时,确实总能走出欧拉回路。
思路可以分成“先走一个圈,再把漏掉的圈接进去”。
从任意一个度数非零的顶点出发,每次选择一条尚未使用的关联边继续走。
在起点之外不可能无路可走。因为每到达一个中间顶点,已使用边在这里暂时表现为“进入比离开多一条”;若所有关联边都已用完,该顶点的度数就会是奇数,与偶度条件矛盾。
图有限,所以这段迹最终会停下;它只能停回起点,于是得到一条闭迹。
若还有边没使用,由边所在部分连通可知,现有闭迹上某个顶点会接到一条未用边。从这个顶点出发,只沿未用边再走,同样会形成另一条闭迹。
若恰有两个奇度顶点 ,可以临时加一条连接 与 的辅助边。即使它们原本相邻,也把辅助边看成一条新的平行边。两点度数各加 后全部变成偶数,于是新图有欧拉回路。再从回路中删掉这条辅助边,闭合路线就在断口处变成一条从 到 的欧拉迹。
这段充分性证明暴露了定理背后的构造过程:不是先猜一条完美路线,而是不断形成闭迹,再把它们拼接起来。
设图的边集是
各顶点度数为
图连通,奇度顶点恰好是 ,所以存在从 到 或从 到 的开放欧拉迹。一条具体路线是
它依次使用 ,每条边恰好一次。注意顶点 和 都重复出现,这不影响它成为欧拉迹,因为欧拉条件禁止的是重复边。
如果再添加一条边 ,那么四个顶点的度数都会变成奇数。此时图仍连通,却不再存在欧拉迹;问题不在于我们还没试到正确路线,而在于四个奇度顶点无法只由一个起点和一个终点吸收。
七座桥抽象出的图有四个顶点,而且四个顶点的度数都是奇数。开放欧拉迹最多允许两个奇度顶点,欧拉回路则一个都不允许,所以答案在尝试路线之前就已经确定:不可能把七条边各走一次。
这也是图论证明很有吸引力的地方。我们不是列出所有路线再逐一失败,而是找到一个每条合法路线都必须满足的结构条件,再看原图直接违反它。
练习:判断下列说法。
学完定义以后,真正要练的是翻译。面对一个新情境,可以先写出模型,再判断题目究竟在问哪种结构。
顶点表示任务、课程或无线电台;两个对象不能共享同一资源时连无向边。问题可能进一步问:至少需要多少个时间段或频道,才能让相邻顶点不冲突?这会引向图着色。
顶点表示课程、任务或软件包;若 必须先于 ,画有向边 。问题可能问某个任务是否间接依赖另一个任务,这就是有向可达性;若依赖图出现有向圈,则说明一组任务互相等待。
顶点表示位置,边表示可以直接移动的一段路线。连通分量回答“哪些位置彼此可达”,距离回答“最少要走几段”,欧拉迹回答“能否把每段路线恰好检查一次”。
顶点表示人,两人合作过就连边。度数回答“某人有多少位直接合作者”,路径回答“合作关系最少隔几层”,连通分量则找出互不相连的合作群体。
同一份现实数据也可以产生不同图。若边只记录“是否合作过”,得到简单图;若每次合作项目都单独保留,得到多重图;若记录“谁邀请了谁”,则得到有向图。模型改变以后,度数和路径的含义也随之改变。
证明存在一条路径、一个回路或一条欧拉迹时,最直接的证据是把顶点或边序列写出来,再逐项检查定义。
证明某结构不存在时,先找所有候选都必须满足的不变量。奇偶性、度数上界、连通分量和同构不变量都适合做排除工具。
证明两图同构时,明确写出顶点双射,并检查边当且仅当对应为边。只说“旋转一下就一样”不算完整证明。
处理连通图时,可以尝试删边、加边或从一个顶点逐步扩张。图论中的归纳经常对顶点数或边数进行,核心动作就是缩小图,再把结构接回来。
图论证明正式开始前,最好先写一两句“我打算检查什么”。例如:“欧拉迹要求每条边恰好一次,所以我先数奇度顶点。”这句话不替代证明,却能让后面的每一步都有来路。
某社交平台记录“用户甲关注用户乙”。应使用无向图还是有向图?若用户可以关注自己,自环是否需要允许?
一个无向图有 个顶点、 条边。所有顶点度数之和是多少?奇度顶点能恰好有 个吗?
在边集
中,序列 是路、迹还是普通走法?
如果无向图中 ,能否断定存在一条长度为 的从 到 的走法?能否断定存在一条长度为 的简单路径?
若有向图中从 能到 ,从 能到 ,可以推出什么?还能推出从 能到 吗?
某个有边的有限无向图只有一个连通分量包含边,各顶点度数为
它有欧拉回路吗?若把其中一个度数 改成 ,其余不变,这个新度数表可能来自无向图吗?
两个简单图都有 个顶点和 条边,第一个图连通,第二个图有两个连通分量。它们可能同构吗?
这一章建立了读图和证明所需的基本语言:顶点与边决定模型,邻接和同构描述结构,度数把局部连接汇总成全局等式,走法与路径刻画可达,连通分量把顶点集合分块,距离挑出最短路线,欧拉迹则展示了局部奇偶性怎样决定整条路线能否存在。
我们还证明了一个连通图有 个顶点时至少需要 条边。现在自然会问:如果它恰好只有 条边,会发生什么?这时每条边都不能再删,两个顶点之间也不该有多余绕路;一旦出现回路,其中总有一条边可以去掉而不破坏连通。
下一章研究的树,正是这种“连通但没有多余边”的图。今天学过的路径、回路、连通分量、度数和生成子图,会在那里合成一组彼此等价的刻画。
图中一共有 条边,所以边端总数是 。
从顶点一侧数,这批边端正是 ,于是两种计数相等。
删除这段绕路,前后仍然在同一个顶点 接上,于是剩下的序列仍是从 到 的走法。
新走法更短,这与原走法最短矛盾。因此最短走法不会重复顶点,它就是一条简单路径。
传递性:若 能到 , 能到 ,把两段路径接起来先得到一条从 到 的走法,再删去重复顶点便得到路径。
把新闭迹插入旧闭迹经过该顶点的位置。重复这个过程,每次至少纳入一条新边;有限次后,所有边都被使用,得到欧拉回路。