本节摘要:拓扑学研究连续变形下保持不变的性质——连通与否、洞有几个、能否定向。本节从欧拉多面体公式与哥尼斯堡七桥问题两个历史起点讲起,建立同胚、连通分支、欧拉示性数与亏格的工具箱,用代码在随机平面图上验证欧拉公式,并沿庞加莱猜想到佩雷尔曼的里奇流看一眼这门学科的巅峰。
第一个起点是 1736 年的哥尼斯堡:普雷格尔河上七座桥,市民问能否每桥恰走一次。欧拉把陆地抽象成点、桥抽象成线,答案取决于每个顶点连接的桥数的奇偶——四个顶点全是奇数度,一笔画不可能。这个问题之所以伟大,不在答案,在于它扔掉了距离、角度、面积,只留连接关系——图论与拓扑的共同胎盘。第二个起点是 1750 年欧拉发现的多面体公式:顶点数减棱数加面数等于二。立方体是 8 减 12 加 6 等于 2, soccer 形截角二十面体是 60 减 90 加 32 等于 2。这两个问题共同宣告:有一类性质,拉伸扭曲都改变不了它。
两个图形若能通过连续变形(不许撕、不许粘)互相变成对方,就叫同胚。咖啡杯与甜甜圈同胚,是这门学科最著名的口号:杯身是"实心"、把手是一个洞,与甜甜圈的"一个洞"在拓扑眼里没有区别。拓扑不变量就是变形中纹丝不动的量:连通分支数(橡皮膜撕不开所以不变)、洞数(亏格)、可定向性(莫比乌斯带只有一个面,翻不过来)、欧拉示性数。不变量的战略价值:想证明两个图形不同构,只需找到一个不变量取值不同——比直接论证"任何变形都失败"省力一万倍。
在随机平面图上数值验证欧拉公式:
import random from collections import defaultdict def random_planar_grid_graph(rows, cols, drop_prob): # 构造网格图并随机删边,保持平面性(网格边不会交叉) edges = set() for r in range(rows): for c in range(cols): if c + 1 < cols and random.random() > drop_prob: edges.add(((r, c), (r, c + 1))) if r + 1 < rows and random.random() > drop_prob: edges.add(((r, c), (r + 1, c))) return edges def euler_check(edges): # 对连通图验证 顶点 - 边 + 面 = 2(平面嵌入,外表面也算一面) verts = set() for u, v in edges: verts.add(u); verts.add(v) V, E = len(verts), len(edges) # 面数用对偶法数:F = E - V + 2 由公式反推只能验证连通分量修正版 # 改为直接数连通分支,验证 顶点 - 边 + 分支数 = 树的情形 adj = defaultdict(list) for u, v in edges: adj[u].append(v); adj[v].append(u) seen, comps = set(), 0 for s in verts: if s in seen: continue comps += 1 stack = [s] while stack: n = stack.pop() if n in seen: continue seen.add(n); stack.extend(adj[n]) return V, E, comps, V - E + comps random.seed(7) edges = random_planar_grid_graph(6, 6, 0.35) print(euler_check(edges)) # 输出形如 (36, 26, 1, ...):对森林 V - E = 分支数 恒成立 # 加上面数后的完整版 V - E + F = 2 只对连通平面图成立;删边破坏连通时公式按分支数修正
第二个实验回到哥尼斯堡,并把"一笔画判定"写成算法——这就是今天的欧拉路径问题,也是 DNA 测序序列装配(de Bruijn 图遍历)的数学内核:
def has_euler_path(degrees): odd = sum(1 for d in degrees.values() if d % 2 == 1) return odd in (0, 2) # 零个奇点有回路,两个奇点有路径,其他情况不可能 konigsberg = {"A": 5, "B": 3, "C": 3, "D": 3} print(has_euler_path(konigsberg)) # 输出 False:四个奇点,七桥问题无解 print(has_euler_path({"A": 2, "B": 2, "C": 4, "D": 2})) # True:五桥改造版可行
欧拉示性数在球面上是二,在甜甜圈(环面)上是零,每加一个洞减二。十九世纪的曲面分类定理给出完美清单:闭曲面由可定向性加亏格完全决定——可定向曲面是球面加 g 个把手,不可定向曲面是球面加 k 条莫比乌斯带。这相当于给所有二维形状发身份证,拓扑学的第一场大胜。

1904 年庞加莱问:闭三维流形若每条闭曲线都能收缩成点,它是否同胚于三维球面?这个"三维版的显然"折磨了拓扑学一百年。2003 年佩雷尔曼用里奇流——让度量随"热传导方程"演化、把曲率抹匀——证明猜想,顺手解决了更广的几何化猜想。值得记住的方法论:他不是直接分类三维流形,而是给流形装了一个随时间演化的动力学过程,让流形自己"流向"标准形状。拓扑问题被动力系统方法攻克,跨分支的武器借用是现代数学的常态(第 5 章动力系统一节将看到同一方程家族)。
⚠️ 学习陷阱:把"同胚"当"相似"。橡皮膜允许极端拉伸,一个又小又皱的圆与一个大而光溜的圆同胚;但"大小""形状"这些度量概念在拓扑里毫无意义。
丢掉度量之后的几何已经说完,下一节把度量请回来但换成极限语言——微积分的严格化改造。