《图论及其应用》课堂笔记:从"握手"讲到"同构",一次把图论入门讲透
下午这门《图论及其应用》,老师上来没急着讲算法,先抛了个特别接地气的问题:一群陌生人互相握手,握过奇数次手的人,会是奇数个吗?
答案是:永远不可能。这就是图论里最有名的"握手定理"。
我上课习惯随手记,一下午记了好几页,回来一看字迹自己都快认不出。索性整理成一篇博客,一来复习,二来分享给同样在啃图论的同学。尽量说人话,有理解偏的地方,欢迎评论区指正。

一、图,到底是个什么东西
先说清楚最基础的:图(Graph)不是什么坐标轴上的曲线,它由两部分组成------顶点(Vertex)和边(Edge)。
你可以把顶点想成"人",边想成"两个人认识"。一个顶点、一条边,这就是全部家当。几个常用说法:
- 简单图:两点之间最多一条边,并且没有自己连自己的环
- 多重图:允许两点之间有好几条边(平行边),也允许自环
- 子图:从原图里挑一部分顶点和边出来,本身还能构成一个图
- n 阶图:数一数有几个顶点,几个顶点就几阶
判断一个图是不是"简单图",就记住两条:不许有平行边,不许有自环。就这么简单。
二、度:一个顶点的"社交圈"有多大
一个顶点连着几条边,这个数就叫它的度(degree),记作 deg(v)。说白了就是"这个人认识多少人"。
有向图稍微复杂一点,边有了方向,于是度被拆成两半:
- 出度:从这个点出去的边数
- 入度:进到这个点的边数
- 三者关系:deg(v) = 出度 + 入度
注意一个小细节------自环(自己连自己的那条边)在数度的时候要算两次,因为它有两个端点都落在同一个顶点上。
握手定理:图论里的"基本法"
终于说到开头那个问题。握手定理说:
任意无向图中,所有顶点的度数之和,等于边数的两倍。即 Σdeg(v) = 2m。
道理其实特别朴素:每一条边都有两个端点,数度数的时候它给两边的顶点各贡献 1,所以每条边会"贡献 2 度",m 条边就是 2m。
由它立刻推出一个漂亮结论:奇度顶点的个数一定是偶数。因为总度数 2m 是偶数,偶度点的度数和也是偶数,那剩下的奇度点度数和也只能是偶数------而只有偶数个奇数相加才是偶数。

回到握手问题:每个人握手几次就是他的度,总握手次数是偶数,所以"握了奇数次手的人"必然是偶数个。图论和生活的距离,有时候就这么近。
三、度序列:一串数字,能画成一个图吗
把图里所有顶点的度按从大到小排好,就得到一个度序列(degree sequence)。比如某个图的度序列是 (3,3,2,2,2,2)。
有意思的问题来了:随便给你一串非负整数,比如 (3,3,2,2,2,2),它能不能对应一个真实的简单图?这叫可图化问题。
先过两道最基础的门槛:
- 度数之和必须是偶数(握手定理直接管的)
- 最大度数不能超过 n−1(n 个点,一个点最多只能连到其他 n−1 个点)
这两条不满足,直接出局。比如 (3,3,1) 和为 7,是奇数,免谈。
但光满足这两条还不够。真正好用的判定工具叫 Havel-Hakimi 定理,思路特别"暴力":
把序列降序排好,拿出最大的那个数 d,把排在它后面的 d 个数各减 1,然后重新排序、重复操作。中途只要出现负数,就说明不可图化;如果最后全变成 0,说明可图化。
拿笔记里那个 (3,3,2,2,2,2) 走一遍:
- 取 3,后面 3 个数 3,2,2 各减 1 → 得到 (2,2,2,1,1)
- 取 2,后面 2 个数各减 1 → (1,1,1,1)
- 取 1 → (1,1,0);再取 1 → (0,0)
- 全是 0,判定:可图化,而且度数总和 14,所以图里有 7 条边
换一个反例 (3,3,3,1):
- 取 3,后面 3 个数 3,3,1 各减 1 → (2,2,0)
- 取 2,后面 2 个数 2,0 各减 1 → (1,−1) ← 出现负数
- 判定:不可图化
写成代码更直观,十几行就能跑:
python
def havel_hakimi(seq):
seq = sorted(seq, reverse=True)
while True:
seq = [d for d in seq if d > 0] # 去掉孤立点(度数为 0)
if not seq:
return True # 全消耗完 → 可图化
d = seq.pop(0) # 取出当前最大度
if d > len(seq): # 想连的人比剩下的人还多
return False
for i in range(d):
seq[i] -= 1
if seq[i] < 0: # 出现负数 → 不可图化
return False
seq.sort(reverse=True) # 重新排序,继续下一轮
print(havel_hakimi([3, 3, 2, 2, 2, 2])) # True,7 条边
print(havel_hakimi([3, 3, 3, 1])) # False
顺便记一句:度序列相同,不代表两个图同构。它是图的不变量(必要线索),但不是身份证。
四、图的运算:删、缩、并、交、乘
这节课花了不小篇幅讲图的运算,我做个小归纳:
- 删除顶点 G − v:把这个点以及它身上的边一起去掉
- 删除边 G − e:只去掉一条边,顶点都留着
- 边的收缩 G·e:把一条边的两个端点合并成一个点,边"缩"进点里
- 并 G ∪ H:两张图合在一起
- 交 G ∩ H:取公共的顶点和边
- 笛卡尔积 G □ H:顶点集是两图顶点集的笛卡尔积,比较"抽象",但例子很直观
笛卡尔积值得单说。笔记里记了这么一句:Q3 = Q2 × K2。
- Q2 就是一个正方形(4 个点、4 条边)
- K2 就是一条线段(2 个点、1 条边)
- 把正方形和线段"乘"一下,就得到 Q3------立方体图,8 个点、12 条边,每个顶点度数都是 3
这个"低维图乘一条边得到高一维图"的规律很漂亮,往下推,Q4、Q5 也就顺理成章了。
五、通路与回路:怎么从 A 走到 B
一个顶点接着一条边地往下走,就走出了通路(walk)。其中起点和终点是特别标注的,比如 v₀ 是起点,vₙ 是终点。
如果走得"讲究"一点,就有了更严格的说法:
- 简单通路:走过的边不重复
- 简单回路(圈):起点和终点是同一个点,且边不重复的闭合通路
判断连通性也靠这个:两点之间有通路,就叫连通;整张图里任意两点都连通,叫连通图。
六、常见图族:几张"明星图"混个脸熟
图论里有些图出场率极高,值得记住长相和参数。

- 完全图 Kₙ:任意两点都相连。n 个点的完全图,边数是 n(n−1)/2(每个点度都是 n−1,套一下握手定理就能推出来)
- 二部图 :顶点能分成两拨,同一拨内部互不相连。如果两拨之间"全连上",就是完全二部图 Kₘ,ₙ
- k-正则图:每个顶点的度都等于 k。比如 Q3 是 3-正则
- 轮图:一个中心点,外加一圈外环,形似车轮
- 彼得森图(Petersen graph):图论界的"反例之王",必须单独说两句
彼得森图有 10 个点、15 条边,每个点的度都是 3(3-正则)。它最出名的地方在于------
- 它不是平面图,你没法把它画在纸上让所有边都不相交
- 它没有哈密顿回路(走遍所有点再回到起点的那种圈),但又确实有 240 条不同的哈密顿路径
- 它的围长是 5,直径是 2
- 它是很多图论猜想的"最小反例"
所以图论定理里一旦出现"是否存在反例",十有八九会请彼得森图出场。记住它,等于记住了一把万能反例钥匙。
七、图同构:换了马甲,我也认得你
两幅图画得完全不一样,就一定不是同一个图吗?不一定。
如果两个图之间存在一个一一对应(双射)的顶点映射 f,使得在原图里两点相连,当且仅当 在另一个图里对应的两个点也相连,那这两个图就是同构的。
说人话:形状可以随便画,只要"谁跟谁连着"这个关系一致,它们就是同一个图。就好比同一个人换了件衣服、换了个姿势拍照,你还是认得出他。
判定同构,先比这几个图不变量(同构必然相同,不同就不用比了):
- 顶点数
- 边数
- 度序列
- 更细一点:各个度的顶点数量、最长 / 最短圈等
不过要注意,这些条件都只是"必要条件"------都相同也可能不同构 ,最终往往还得真的去找那个对应关系。另外有个很省事的定理:G 与 H 同构,当且仅当它们的补图也同构。
八、子图、补图、导出子图
最后补齐几个容易混的概念:
- 子图:顶点集和边集都是原图的子集
- 导出子图:选一部分顶点,把这些顶点之间原图里所有的边都带上,就叫点导出子图
- 补图(complement):在同样的顶点上,把原本没连的边全连上、原本连的边全去掉,得到的图就是原图的补图
补图有个很优雅的例子:C₅(五边形)的补图,还是 C₅ 自己------这叫自补图。而彼得森图的补图是个 6-正则图,也挺漂亮。
九、图论能干嘛:别以为是纯数学
一节课听下来,图论基础概念确实有点"抽象",但它的应用场景其实非常实在:
- 社交网络:谁和谁认识、信息怎么传播,就是一张巨大的图
- 路径规划:地图导航、网络路由,本质是在图里找最短通路
- 任务调度:用二部图做人员与任务的匹配
- 网络鲁棒性:删掉哪些顶点 / 边会让网络断掉,看的就是连通性
- 化学分子、电路网络:分子结构、元器件连接,天然就是图
所以别小看"顶点"和"边"这两个词,它们撑起了后面一大半的算法课程。
十、小结:一张表带走今天的重点
| 概念 | 一句话理解 | 要记的关键点 |
|---|---|---|
| 度 | 顶点连了几条边 | 自环算 2 度;有向图 = 出度 + 入度 |
| 握手定理 | 度数之和 = 2×边数 | 奇度顶点个数必为偶数 |
| 度序列 | 度数排好的一串数 | 和为偶数、最大度 ≤ n−1 是前提 |
| 可图化 | 这串数能不能画成简单图 | Havel-Hakimi:最大的数配后面的数,出现负数即失败 |
| 图的运算 | 删点、删边、收缩、并交、笛卡尔积 | Q3 = Q2 × K2 |
| 通路/回路 | 一路走下来 | 简单通路:边不重复 |
| 常见图族 | Kₙ、Kₘ,ₙ、正则图、轮图 | 彼得森图:10 点 15 边,3-正则,非平面非哈密顿 |
| 图同构 | 换马甲还是同一个人 | 比顶点数、边数、度序列,G≅H ⟺ 补图同构 |
| 补图/导出子图 | 反着连 / 全带着 | C₅ 是自补图 |
一句话收尾:图论研究的不是"图画得好不好看",而是"连接关系是什么"。顶点可以叫 v₁、v₂,也可以叫张三、李四,名字无所谓;真正重要的是谁连着谁。把这个想通了,后面的算法和网络分析,就有了落脚的地方。
说明:笔记有几处字写得很飞,个别地方我按上下文做了补全,若有出入欢迎指正。整理不易,觉得有用的话点个赞,我们下篇见。