离散数学&数据结构 - 图论常匹配问题与算法概括

This post is not yet available in English. Showing the original version.

May 12, 2025

Table of Contents
Table of Contents

离散数学&数据结构-图论常匹配问题与算法概括

基本图论算法

一、最小生成树(Minimum Spanning Tree,MST)


二、最短路径(Single/All Pairs Shortest Path)


三、旅行商问题(Traveling Salesman Problem,TSP)


四、中国邮路问题(Euler 回路)


五、拓扑排序问题(DAG 上的排序)


一眼看图识题技巧

问题关键词属于哪一类应用算法
连通、造价最小最小生成树(MST)Prim / Kruskal
起点到各点最短最短路径Dijkstra / SPFA
所有点走一圈旅行商问题(TSP)状压 DP / 搜索
所有边走一遍中国邮路(Euler 回路)Hierholzer
有依赖顺序安排拓扑排序(DAG)Kahn / DFS

图论算法衍生

网络流

EK算法最大流

最大流问题就是:

想象你是个调水的管道工: 有个源点(source):水从这儿开始流。 有个汇点(sink):水最终要流到这。 图里的每条边是水管,有个最大能流多少水的限制(容量)。 你要解决的核心问题就是 “从源点最多能往汇点送多少水?”

EK算法最大流是:

广度优先去找:从源点到汇点还有没有“能通的水路”。 找到就“倒水”:找出这条路上最细的那根管子(瓶颈),推这么多流量。 更新管道:把用掉的流量减去,剩下的再来。 直到你怎么找都找不到新路了:那就是最大流了。

Edmonds-Karp 是一种 基于广度优先搜索(BFS) 的最大流算法,属于 Ford-Fulkerson 方法的实现之一。 注意:离散数学考试给予简化版本,不维护反向边。

它的核心思想是:
每次用 BFS 在残量网络中找一条从源点 S 到汇点 T 的最短增广路径,然后将该路径上的可增广流量加入到总流中,并更新残量网络。

核心结构

假设你有如下图的网络:

S --(10)--> A --(5)--> T
 \                      /
  \----(15)------------/

你用 BFS 找到 S->A->T,可增广流为 5,再找 S->T,可增广流为 15
总流量 5 + 15 = 20,路径更新后不能再增广,算法结束。

最小割

最大流 = 能从水库 S 送到城市 T 的最多水量 最小割 = 一刀下去能阻断的最小总水流(把某些管道切掉) 换句话说: 最大你能送的 = 最少别人能拦的

S --(3)--> A --(2)--> T
 \                  /
  \----(4)--------/

最大流是 5(S→A→T 走 2,S→T 走 3) 最小割是割断 S→TA→T(容量是 3+2=5) 他们相等,定理成立。


术语定义(通俗解释)
网络流图一个带有容量限制的有向图,每条边表示“能容纳多少流量”。
源点(S)流量的起点,像是“水库”或“工厂”。
汇点(T)流量的终点,像是“城市”或“消费者”。
流量(Flow)实际通过边的流量,不能超过边的容量。
容量(Capacity)边所能承受的最大流量,相当于“管道粗细”。
残量网络当前流量状态下,图中还可以继续“走”的路径与容量。
增广路在残量网络中,从源点到汇点还可以“加流”的路径。
最大流从源点到汇点能“加”上的最大总流量。
割(Cut)把图的点分成两个集合,源点在一边,汇点在另一边。
割的容量从源点集合通向汇点集合的边的容量总和。
最小割所有可能割中,容量最小的一个,表示“最小阻断能力”。
最大流最小割定理最大能通过的流量 = 最小能拦下的割。
EK算法(Edmonds-Karp)使用 BFS 查找增广路,逐步累加流量,直到没有增广路。时间复杂度 O(VE²)。
Dinic算法更快的最大流算法,基于分层图+DFS增广。时间复杂度 O(V²E)(稀疏图较优)。