基于线性规划的图最大流问题的Goldberg-Rao算法求解示例
题目描述:
考虑一个有向图 \(G = (V, E)\) ,其中 \(V\) 是顶点集,\(E\) 是边集。每条边 \((u,v) \in E\) 有一个非负容量 \(c(u,v) \ge 0\)。指定一个源点 \(s \in V\) 和一个汇点 \(t \in V\)。目标是计算从 \(s\) 到 \(t\) 的最大流,即满足容量约束和流量守恒的可行流中,从 \(s\) 流出的总流量的最大值。Goldberg-Rao算法是一种基于容量缩放和阻塞流思想的高效算法,在最坏情况下时间复杂度为 \(O(\min\{V^{2/3}, E^{1/2}\} \cdot E \log(V^2/E) \log U)\),其中 \(U\) 是最大边容量。本示例将详细讲解该算法的步骤、原理和实现细节。
解题过程循序渐进讲解:
1. 问题建模与基本概念回顾
最大流问题的线性规划形式为:
最大化 \(\sum_{(s,v)\in E} f(s,v)\)
约束:
\[0 \le f(u,v) \le c(u,v), \quad \forall (u,v) \in E \]
\[\sum_{(u,v)\in E} f(u,v) - \sum_{(v,u)\in E} f(v,u) = 0, \quad \forall v \in V \setminus \{s,t\} \]
但Goldberg-Rao算法是组合优化算法,不直接求解线性规划,而是通过迭代改进流量。
关键概念:
- 剩余图:给定流 \(f\),剩余容量 \(r(u,v) = c(u,v) - f(u,v) + f(v,u)\)(若反向边存在则计入反向流量)。
- 距离标签:每个顶点 \(v\) 的标签 \(d(v)\) 表示在剩余图中到汇点 \(t\) 的估计距离(边数)。
- 阻塞流:在剩余图中,一条从 \(s\) 到 \(t\) 的路径上最小剩余容量为 0 的流,使得无法再通过该路径发送更多流量。
2. Goldberg-Rao算法的核心思想
算法结合了容量缩放和阻塞流计算:
- 从高容量阈值开始,逐步降低阈值,只考虑剩余容量较大的边进行推送。
- 在每一轮缩放中,通过计算阻塞流来增加流量。
- 使用距离标签来指导推送方向,并定期更新标签以保证正确性。
3. 算法步骤详解
步骤1:初始化
- 设置初始流 \(f(u,v) = 0\)。
- 计算最大边容量 \(U = \max_{(u,v)\in E} c(u,v)\)。
- 设置初始缩放参数 \(\Delta = 2^{\lfloor \log_2 U \rfloor}\)(即不超过 \(U\) 的最大2的幂)。
步骤2:缩放阶段循环
当 \(\Delta \ge 1\) 时重复以下步骤:
步骤2.1:构建 Δ-剩余图
定义 Δ-剩余图 \(G_f(\Delta)\) :只包含剩余容量 \(r(u,v) \ge \Delta\) 的边。
步骤2.2:计算距离标签
在 Δ-剩余图中,计算从每个顶点到 \(t\) 的距离(以边数为单位):
- 通过 BFS 从 \(t\) 反向遍历(沿边的反方向),得到 \(d(v)\),即 \(v\) 到 \(t\) 的最短路径估计。
- 对于无法到达 \(t\) 的顶点,设 \(d(v) = |V|\)。
步骤2.3:推送阻塞流
在 Δ-剩余图中,只考虑满足 \(d(u) = d(v) + 1\) 的边(允许的边)进行推送。
通过多次DFS搜索从 \(s\) 到 \(t\) 的路径,并沿路径推送尽可能多的流量,直到无法找到增广路。
推送的流量不超过路径上最小剩余容量,且每次推送后更新剩余图。
步骤2.4:更新缩放参数
当 Δ-剩余图中不存在从 \(s\) 到 \(t\) 的路径时,将 Δ 减半:\(\Delta \leftarrow \Delta / 2\)。
若 Δ < 1,则终止缩放阶段。
步骤3:输出最大流
返回当前流 \(f\) 作为最大流。
4. 正确性与复杂度说明
- 正确性:每次推送保证不违反容量约束和守恒条件;算法结束时,Δ-剩余图中无 \(s-t\) 路径,且由于容量缩放性质,当前流是最大流(依据最大流最小割定理)。
- 复杂度:每一轮缩放中,阻塞流计算复杂度为 \(O(E \cdot \min\{V^{2/3}, E^{1/2}\})\),缩放次数为 \(O(\log U)\),总复杂度如上所述。
5. 举例说明
考虑简单图:\(V = \{s,a,b,t\}\),边容量:
\((s,a):4, (s,b):2, (a,b):3, (a,t):1, (b,t):5\)。
执行过程:
- 初始化:\(f=0, U=5, \Delta=4\)。
- Δ=4:Δ-剩余图仅有边 (s,a)(容量4),推送流量4,但路径 s-a-t 不完整(a-t容量1<Δ),无法推送。Δ减半为2。
- Δ=2:Δ-剩余图包含 (s,a):4, (a,b):3, (b,t):5。距离标签:d(t)=0, d(b)=1, d(a)=2, d(s)=3。沿允许边推送:路径 s-a-b-t 推送流量2(最小剩余容量 min(4,3,5)=2)。更新后,Δ-剩余图仍存在 s-a-t 路径(a-t容量1<Δ,不在图中),但 s-a-b-t 路径已满。Δ减半为1。
- Δ=1:在完整剩余图中推送阻塞流,得到最大流值6。
最终最大流为6,对应于割 {s,a,b} 到 {t} 的容量。
总结:Goldberg-Rao算法通过容量缩放减少增广路径搜索次数,利用距离标签指导推送,是高效的最大流算法之一。本示例展示了其逐步推导和实现思路,有助于深入理解线性规划在图论问题中的应用背景。