跳转到内容

网络流与匹配

网络流把"容量约束下的运输"形式化:边上限流,求源到汇的最大流量。它的威力在于建模——很多看似无关的问题(匹配、切割、调度)都能归约到流。本章讲主流算法、最大流最小割定理与匹配。

流网络:有向图,每条边有容量 c(e)c(e),源 ss、汇 tt。流满足两条:容量约束(0≤f(e)≤c(e)0 \le f(e) \le c(e))与守恒(除源汇,进 = 出)。求 s→ts \to t 的最大流量。

残余网络:剩余容量 c−fc - f 加反向边 ff——反向边是所有流算法的关键:它允许"撤销"之前的流,把次优分配改掉。没有反向边,贪心会卡在次优解。

反复在残余网络中找增广路径(s→ts \to t 的正容量路径),沿路径推流。整数容量时终止,但找路径的方式决定复杂度:任意路径最坏 O(E⋅∣fmax⁡∣)O(E \cdot |f_{\max}|)(慢),按容量最大或最短路径选择则多项式。

增广路径取 BFS(边数最少)。复杂度 O(VE2)O(VE^2)——增广次数有界 O(VE)O(VE),与容量无关。实现最简单的多项式流算法。

分层网络(按到源的距离分层)+ 阻塞流(一次 DFS 推尽可能多的流):阶段数 O(V)O(V),每阶段 O(VE)O(VE),总 O(V2E)O(V^2E);单位容量图上 O(EE)O(E\sqrt{E})。实践中通常最快,是竞赛与工程的主流。

算法复杂度备注
Ford-Fulkerson$O(E \cdotf
Edmonds-KarpO(VE2)O(VE^2)BFS 找增广路,实现最简
DinicO(V2E)O(V^2 E)分层 + 阻塞流,实践主流

最小割:把顶点分成含 ss 与含 tt 的两部分,横跨的容量之和;最小的那个是"最窄的瓶颈"。定理:

max⁡f∣f∣=min⁡(S,T)∑e∈S→Tc(e).\max_{f} |f| = \min_{(S, T)} \sum_{e \in S \to T} c(e).

证明思路:最大流时残余网络无增广路 → 可达集即最小割。最大流 = 最小割是线性规划对偶的特例——原始问题(流)与对偶问题(割)的值相等,这是 LP 对偶最直观的实例。推论与应用:对偶性、图的连通性(边连通度 = 最小割)、图像分割(前景/背景切割)。

匈牙利算法求二分图最大匹配:反复找增广路径(交替未匹配/匹配边的路径),找到则翻转增配。O(VE)O(VE)。

更简单的建模:二分图匹配可用最大流解——源连左侧(容量 1),左右之间边容量 1,右侧连汇(容量 1),最大流即最大匹配。最小点覆盖 = 最大匹配(König 定理)也是对偶性的实例。

建图能力比算法本身更重要。常见的归约模式:

  • 元素配额 → 源/汇容量 1(匹配、任务分配);
  • 约束上限 → 边容量(调度、带宽);
  • "选或不选" → 最小割(项目选择问题:收益进汇、成本进源);
  • 状态转移 → 分层图(时间作为一层,边跨层)。

判断信号:问题里有"容量/上限"、有"配对/分配"、有"分割/选择"——先想流。

  • 残余网络与反向边是流算法的关键:允许撤销次优分配
  • Dinic(分层 + 阻塞流)是实践主流;Edmonds-Karp 实现最简
  • 最大流 = 最小割是 LP 对偶的特例;最小割是"最窄的瓶颈"
  • 二分图匹配可用最大流解;最小点覆盖 = 最大匹配(König)
  • 建图能力比算法更重要:容量、配对、分割信号先想流