xxx 最大流问题(Capacity Scaling 优化)
字数 1456 2025-11-02 00:38:44
xxx 最大流问题(Capacity Scaling 优化)
题目描述
给定一个有向图 G=(V,E),其中每条边 e 有一个非负容量 c(e)≥0。图中有一个源点 s 和一个汇点 t。最大流问题的目标是找到从 s 到 t 的最大流量,即允许通过边的流不超过其容量的情况下,从 s 发送到 t 的最大流值。Capacity Scaling 优化是 Ford-Fulkerson 方法的一种改进,通过逐步处理不同数量级的容量来提高效率,特别适用于容量差异较大的图。
解题过程
-
基础概念回顾
- 流函数 f: E→R 满足容量限制(f(e)≤c(e))和流量守恒(除 s 和 t 外,流入等于流出)。
- 残量图 G_f:对每条边 e=(u,v),若 c(e)-f(e)>0,则保留边,容量为 c(e)-f(e);同时添加反向边 (v,u),容量为 f(e)。
- Ford-Fulkerson 方法:在残量图中反复寻找增广路径(s 到 t 的路径),并沿路径增加流量。
-
Capacity Scaling 的核心思想
- 问题:Ford-Fulkerson 在容量差异大时可能效率低(例如,若容量为无理数可能不终止)。
- 优化思路:优先处理“大容量”的边,忽略小容量边,逐步细化。设置一个缩放参数 Δ,初始时 Δ 为最大的 2 的幂次(不超过最大容量)。在每轮迭代中,仅考虑残量图中容量 ≥Δ 的边,寻找增广路径。当无法找到时,将 Δ 减半,重复直到 Δ<1。
-
算法步骤
步骤 1:初始化- 设流 f 初始为 0。
- 计算 Δ = 2^⌊log₂U⌋,其中 U 是图中最大边的容量。
步骤 2:缩放阶段(Δ-Scaling Phase)
- 当 Δ ≥ 1 时:
a. 构建残量图 G_f(Δ),仅包含残量容量 ≥Δ 的边。
b. 在 G_f(Δ) 中搜索从 s 到 t 的路径(如用 BFS 或 DFS)。- 若找到路径 P,则沿 P 推送尽可能多的流量(增广量为路径上最小残量容量)。
- 若找不到路径,则令 Δ = Δ/2,进入下一缩放阶段。
步骤 3:终止条件
- 当 Δ < 1 时停止,当前流 f 即为最大流。
-
实例演示
考虑一个简单图:s→A (容量 5), s→B (容量 3), A→t (容量 3), B→t (容量 5), A→B (容量 2)。- 初始 Δ=4(最大容量 5,2^2=4≤5)。
- Δ=4 时:残量图仅含 s→A (残量 5≥4) 和 B→t (残量 5≥4),但无 s 到 t 路径,故 Δ 降为 2。
- Δ=2 时:边 s→A, s→B, A→t, B→t, A→B 均满足残量≥2。找到路径 s→A→t,推送流量 2(A→t 容量限制)。更新后 A→t 残量剩 1,s→A 残量剩 3。
- 继续找路径 s→B→t,推送流量 2。此时 Δ=2 下再无增广路径,Δ 降为 1。
- Δ=1 时:在完整残量图中增广,例如 s→A→B→t 推送流量 1。最终流量为 2+2+1=5,达到最大流。
-
为什么有效?
- 每轮缩放阶段至少推送 Δ 的流量,且阶段数最多 O(log U)。
- 每阶段内增广次数有界(例如 O(|E|)),总复杂度为 O(|E|² log U),优于基础 Ford-Fulkerson 的 O(|E|·f)(f 为最大流值)。
-
关键点总结
- Capacity Scaling 通过“由大到小”处理容量,避免在小流量增广上浪费时间。
- 适用于容量范围大的图,保证多项式时间复杂度,与具体容量值无关。