图论进阶

9 minAdvanced2026/6/14

平面图与Euler公式、图的着色、匹配与覆盖、网络流、最短路径算法、最小生成树、拓扑排序。

1. 平面图与 Euler 公式

1.1 平面图

平面图:可以在平面上画出且边不相交的图。

面:平面图将平面划分的区域。

  • 外部面(无限面):无界的区域
  • 内部面:有界的区域

1.2 Euler 公式

设连通平面图 GG 有 nn 个顶点、mm 条边、ff 个面,则

n−m+f=2n - m + f = 2

证明(对边数归纳):

  • m=0m = 0:n=1n = 1,f=1f = 1,1−0+1=21 - 0 + 1 = 2
  • 设 m<km < k 时成立。m=km = k 时:
    • 若 GG 无圈(树):m=n−1m = n-1,f=1f = 1,n−(n−1)+1=2n-(n-1)+1 = 2
    • 若 GG 有圈:删除圈上一边 ee,G′=G−eG' = G - e 连通,n′=nn' = n,m′=m−1m' = m-1,f′=f−1f' = f-1。由归纳假设 n−(m−1)+(f−1)=2n - (m-1) + (f-1) = 2,即 n−m+f=2n - m + f = 2

1.3 推论

推论1:简单连通平面图(n≥3n \geq 3)满足 m≤3n−6m \leq 3n - 6。

每个面至少由3条边围成,2m≥3f2m \geq 3f,f≤2m3f \leq \frac{2m}{3}。 代入 Euler 公式:n−m+2m3≥2n - m + \frac{2m}{3} \geq 2,m≤3n−6m \leq 3n - 6。

推论2:K5K_5 不是平面图。

K5K_5:n=5n = 5,m=10m = 10,3n−6=9<103n - 6 = 9 < 10,矛盾。

推论3:K3,3K_{3,3} 不是平面图。

K3,3K_{3,3} 无三角形,每个面至少4条边,2m≥4f2m \geq 4f,f≤m/2f \leq m/2。 n−m+m/2≥2n - m + m/2 \geq 2,m≤2n−4=8<9m \leq 2n - 4 = 8 < 9,矛盾。

1.4 Kuratowski 定理

定理:图 GG 是平面图   ⟺  \iff GG 不含与 K5K_5 或 K3,3K_{3,3} 同胚的子图。

同胚:两个图通过在边上插入或删除2度顶点后同构。

1.5 对偶图

平面图 GG 的对偶图 G∗G^*:

  • GG 的每个面对应 G∗G^* 的一个顶点
  • GG 的每条边对应 G∗G^* 的一条边(连接相邻面对应的顶点)

2. 图的着色

2.1 顶点着色

正常着色:相邻顶点颜色不同。

色数 χ(G)\chi(G):正常着色所需的最少颜色数。

2.2 色数的界

上界:

  • χ(G)≤Δ(G)+1\chi(G) \leq \Delta(G) + 1(Δ\Delta 为最大度)
  • Brooks 定理:若 GG 不是完全图也不是奇圈,则 χ(G)≤Δ(G)\chi(G) \leq \Delta(G)

下界:

  • χ(G)≥ω(G)\chi(G) \geq \omega(G)(ω\omega 为最大团的大小)

2.3 特殊图的色数

图色数
二部图2
偶圈 C2kC_{2k}2
奇圈 C2k+1C_{2k+1}3
KnK_nnn
树2(非平凡)

2.4 四色定理

定理:任何平面图的色数不超过4,即 χ(G)≤4\chi(G) \leq 4(GG 为平面图)。

2.5 色多项式

P(G,k)P(G, k):用 kk 种颜色正常着色的方案数。

性质:

  • P(Kn,k)=k(k−1)(k−2)⋯(k−n+1)P(K_n, k) = k(k-1)(k-2)\cdots(k-n+1)
  • P(T,k)=k(k−1)n−1P(T, k) = k(k-1)^{n-1}(TT 为 nn 阶树)
  • 缩减公式:P(G,k)=P(G−e,k)−P(G⋅e,k)P(G, k) = P(G-e, k) - P(G \cdot e, k)

其中 G⋅eG \cdot e 为收缩边 ee 后的图。

3. 匹配与覆盖

3.1 基本概念

  • 匹配 MM:边集,其中任意两条边不共享端点
  • 最大匹配:边数最多的匹配
  • 完美匹配:覆盖所有顶点的匹配
  • 顶点覆盖 CC:顶点集,每条边至少有一个端点在 CC 中
  • 独立集 II:顶点集,其中任意两个顶点不相邻

3.2 König 定理

在二部图中,最大匹配的边数 = 最小顶点覆盖的顶点数。

3.3 增广路径

增广路径:交替使用匹配边和非匹配边,且两端都是未匹配顶点的路径。

Berge 定理:匹配 MM 是最大匹配   ⟺  \iff 不存在关于 MM 的增广路径。

3.4 匈牙利算法

求二部图最大匹配:

  1. 初始匹配为空
  2. 对每个未匹配顶点,寻找增广路径
  3. 若找到,翻转路径上的匹配/非匹配边
  4. 重复直到无增广路径

4. 网络流

4.1 流网络

流网络 N=(G,s,t,c)N = (G, s, t, c):

  • G=(V,E)G = (V, E) 为有向图
  • ss 为源点,tt 为汇点
  • c:E→R+c: E \to \mathbb{R}^+ 为容量函数

流 f:E→R+f: E \to \mathbb{R}^+ 满足:

  1. 容量约束:0≤f(e)≤c(e)0 \leq f(e) \leq c(e)
  2. 流量守恒:∑e∈δ+(v)f(e)=∑e∈δ−(v)f(e)\sum_{e \in \delta^+(v)} f(e) = \sum_{e \in \delta^-(v)} f(e)(v≠s,tv \neq s, t)

流的值:∣f∣=∑e∈δ+(s)f(e)−∑e∈δ−(s)f(e)|f| = \sum_{e \in \delta^+(s)} f(e) - \sum_{e \in \delta^-(s)} f(e)

4.2 最大流最小割定理

割 (S,T)(S, T):s∈Ss \in S,t∈Tt \in T,S∪T=VS \cup T = V,S∩T=∅S \cap T = \emptyset。

割的容量:c(S,T)=∑u∈S,v∈Tc(u,v)c(S, T) = \sum_{u \in S, v \in T} c(u,v)

定理:最大流的值 = 最小割的容量。

4.3 Ford-Fulkerson 算法

  1. 初始流为0
  2. 在残量网络中找 ss 到 tt 的增广路径
  3. 沿增广路径增加流量
  4. 重复直到无增广路径

残量网络:cf(u,v)=c(u,v)−f(u,v)+f(v,u)c_f(u,v) = c(u,v) - f(u,v) + f(v,u)

Edmonds-Karp 算法:用 BFS 找最短增广路径,时间复杂度 O(VE2)O(VE^2)。

5. 最短路径算法

5.1 Dijkstra 算法

求单源最短路径(非负权图)。

dist[s] = 0, dist[v] = ∞ (v ≠ s)
S = ∅
while S ≠ V:
    u = V\S 中 dist 最小的顶点
    S = S ∪ {u}
    for each (u, v) ∈ E:
        dist[v] = min(dist[v], dist[u] + w(u,v))

时间复杂度:O(V2)O(V^2) 或 O((V+E)log⁡V)O((V+E)\log V)(优先队列)

5.2 Bellman-Ford 算法

允许负权边,可检测负圈。

dist[s] = 0, dist[v] = ∞ (v ≠ s)
for i = 1 to |V| - 1:
    for each (u, v) ∈ E:
        dist[v] = min(dist[v], dist[u] + w(u,v))
// 检测负圈
for each (u, v) ∈ E:
    if dist[v] > dist[u] + w(u,v):
        存在负圈

时间复杂度:O(VE)O(VE)

5.3 Floyd-Warshall 算法

求所有顶点对之间的最短路径。

d[i][j] = w(i,j) if (i,j) ∈ E, else ∞
for k = 1 to |V|:
    for i = 1 to |V|:
        for j = 1 to |V|:
            d[i][j] = min(d[i][j], d[i][k] + d[k][j])

时间复杂度:O(V3)O(V^3)

6. 拓扑排序

6.1 适用条件

有向无环图(DAG)。

6.2 定义

拓扑排序是将 DAG 的顶点排成线性序列,使得对每条有向边 (u,v)(u, v),uu 在序列中位于 vv 之前。

6.3 算法

Kahn 算法:

  1. 计算所有顶点的入度
  2. 将入度为0的顶点入队
  3. 出队一个顶点,将其所有后继的入度减1
  4. 若后继入度变为0,入队
  5. 重复直到队列为空

时间复杂度:O(V+E)O(V + E)

DFS 方法:按完成时间的逆序排列。

例:课程先修关系可用 DAG 表示,拓扑排序给出一种合法的选课顺序。

7. 关键路径

7.1 AOE 网

AOE 网(Activity On Edge):用边表示活动,顶点表示事件。

  • 源点:入度为0的顶点(工程开始)
  • 汇点:出度为0的顶点(工程结束)

7.2 关键路径

最早发生时间:ve(vj)=max⁡{ve(vi)+w(vi,vj)}ve(v_j) = \max\{ve(v_i) + w(v_i, v_j)\}

最迟发生时间:vl(vj)=min⁡{vl(vk)−w(vj,vk)}vl(v_j) = \min\{vl(v_k) - w(v_j, v_k)\}

关键活动:e(i)=l(i)e(i) = l(i) 的活动(最早开始时间 = 最迟开始时间)

关键路径:由关键活动组成的路径,决定了工程的最短完成时间。