xxx 最大流问题(Goldberg-Rao 算法)
字数 2201 2025-11-27 02:03:12
xxx 最大流问题(Goldberg-Rao 算法)
题目描述
给定一个有向图 \(G = (V, E)\),每条边 \(e \in E\) 有一个非负容量 \(c(e) \geq 0\),以及源点 \(s\) 和汇点 \(t\)。Goldberg-Rao 算法用于计算从 \(s\) 到 \(t\) 的最大流。该算法结合了 Push-Relabel 的思想和容量缩放技术,通过动态调整流和标签(距离函数)来高效求解大规模稀疏图的最大流问题,时间复杂度为 \(O(\min\{V^{2/3}, E^{1/2}\} \cdot E \log(V^2/E) \log U)\),其中 \(U\) 是最大边容量。
解题过程
-
基本概念回顾
- 预流(Preflow):允许顶点持有超额流(excess flow),即流入量大于流出量(除源点 \(s\) 和汇点 \(t\) 外)。
- 距离标签(Distance Label):每个顶点 \(v\) 维护一个整数标签 \(d(v)\),表示到汇点 \(t\) 的估计距离。标签需满足 \(d(t) = 0\) 且对于残量边 \((u, v)\),有 \(d(u) \leq d(v) + 1\)。
- 残量图(Residual Graph):边 \((u, v)\) 的残量容量为 \(c_f(u, v) = c(u, v) - f(u, v) + f(v, u)\)。
-
算法框架
Goldberg-Rao 算法分为外层的容量缩放阶段和内层的 Push-Relabel 操作:- 容量缩放:将问题分解为多个子问题,每个子问题处理一个容量尺度 \(\Delta\)。初始时 \(\Delta = 2^{\lfloor \log_2 U \rfloor}\),每阶段结束后将 \(\Delta\) 减半。
- Δ-残量图:仅保留残量容量 \(\geq \Delta\) 的边,忽略容量较小的边。
- Δ-最大流:在当前尺度 \(\Delta\) 下,通过 Push-Relabel 操作使流满足 Δ-近似最优性。
-
详细步骤
步骤 1:初始化- 设置流 \(f(e) = 0\) 对所有边 \(e\)。
- 初始化距离标签 \(d(v)\) 为 \(v\) 到 \(t\) 的 BFS 距离(在残量图中)。
- 设置初始尺度 \(\Delta = 2^{\lfloor \log_2 U \rfloor}\)。
步骤 2:容量缩放循环
当 \(\Delta \geq 1\) 时重复以下过程:- 构建 Δ-残量图:删除所有残量容量 \(< \Delta\) 的边。
- Δ-推送(Δ-Push)操作:
- 选择超额流 \(> 0\) 的顶点 \(u\)(称为活跃顶点)。
- 若存在边 \((u, v)\) 满足 \(d(u) = d(v) + 1\) 且残量容量 \(\geq \Delta\),则沿该边推送 \(\min\{excess(u), c_f(u, v)\}\) 的流。
- 若无法推送,则执行 重标签(Relabel):将 \(d(u)\) 更新为 \(\min\{d(v) + 1 \mid (u, v) \in E_f\}\),其中 \(E_f\) 是残量边集。
- 阶段结束条件:当所有顶点(除 \(s\) 和 \(t\))的超额流为 0,或 \(\Delta\) 尺度下无法进一步推送时,将 \(\Delta \leftarrow \Delta / 2\)。
步骤 3:终止与输出
- 当 \(\Delta < 1\) 时,算法终止。此时流 \(f\) 即为最大流。
-
关键优化与注意事项
- 单调性:距离标签 \(d(v)\) 在重标签过程中严格递增,确保算法终止。
- 复杂度分析:每个尺度 \(\Delta\) 的推送次数受 \(O(V^2)\) 限制,总尺度数为 \(O(\log U)\),结合动态树(Dynamic Trees)可进一步优化。
- 特殊边处理:当 \(\Delta\) 较小时,算法退化为标准 Push-Relabel,但通过尺度分解避免了低效操作。
-
实例演示
考虑一个简单图:顶点集 \(V = \{s, a, b, t\}\),边容量 \(c(s, a) = 3, c(s, b) = 2, c(a, b) = 1, c(a, t) = 2, c(b, t) = 3\)。- 初始 \(\Delta = 4\)(因最大容量为 3,实际取 \(\Delta = 2\))。
- 在 \(\Delta = 2\) 阶段:推送流 \(s \rightarrow a \rightarrow t\) 和 \(s \rightarrow b \rightarrow t\),得到流值 4。
- 在 \(\Delta = 1\) 阶段:调整流利用边 \(a \rightarrow b\),最终最大流为 5。
通过以上步骤,Goldberg-Rao 算法以高效的方式解决了最大流问题,尤其适用于稀疏大图。