问题求解(三) Open Topic 11 笔记

OT:除福特-法尔克森算法外,最大流问题还有很多其它算法,例如 Edmonds-Karp 算法、Dinitz 算法、Push-Relabel 算法等,请调研至少2种算法(其中至多1种来自上述例子),结合例子介绍算法的设计与分析,与福特-法尔克森算法比较异同并分析优劣。

slide

任意图上 \(O(nm)\) 的网络最大流算法

引言

[1] (Orlin, 2013) 给出了一种在任意图上 \(O(nm)\) 的网络最大流算法。

前置结果和本文贡献

[1] 中的若干证明用到了一些前置结果:

  • [2] (King et al., 1994) 给出了强多项式 \(O(nm\log_{m/(n\log n)})\) 的算法。对于任意 \(m=\Omega(n^{1+\epsilon})\),该算法都是 \(O(nm)\) 的。
  • [3] (Goldberg & Rao, 1998) 给出了弱多项式的算法,每轮将 \(\Delta\) bounded 的最大流问题转化为 \(\Delta/2\) bounded 的最大流问题,每轮时间为 \(O(\min\lbrace n^{2/3}, m^{1/2}\rbrace\cdot m\log (n^2/m))\)

可以发现,需要攻克的仅在于 \(m\) 不超过多项式地渐进大于 \(n\) 时。

本文提出 \(O(nm+m^{31/16}\log^2n)\) 的算法。当 \(m=O(n^{(16/15)-\epsilon})\) 时,该结果是 \(O(nm)\) 的。

和上文第一个结果相结合,得到了对任意图 \(O(nm)\) 的网络最大流算法。

主要思路

主要利用某种方法套用了 Goldberg 的结果:若最大流为 \(U\),则时间为 \[ T(n)=\tilde O(\min\lbrace n^{2/3}, m^{1/2}\rbrace\cdot m\log U). \]

  • \(\log U\le m^{7/16}\),则有

\[ T(n)=\tilde O(m^{1/2}\cdot m\cdot m^{7/16})=\tilde O(m^{31/16}), \]

已然满足条件。

  • \(\log U\le m^{7/16}\),则在每轮前,把原图压缩\(C\) 顶点、\(O(C^2)\) 边的图。平均 \(C=O(m/\log U)\),则单轮中 \(n'=C, m'=O(C^2)\),带入有单轮时间为

\[ \tilde O(C^{2/3}\cdot C^2)=\tilde O(C^{8/3}). \]

于是 \(O(\log U)\) 轮总时间为

\[ T(n)=\tilde O(C^{8/3}\log U)=\tilde O(m^{8/3}\log^{-5/3}U)=\tilde O(m^{8/3}\cdot (m^{7/16})^{-5/3})=\tilde O(m^{16/31}). \]

故问题的核心在于:要寻求一种压缩方式使得平均 \(C=O(m/\log U)\),且对于流的影响较小。

基本方法

[1] 提出的算法同样由 \(O(\log U)\) 构成,每轮的步骤是:

  1. 收缩(comtraction)。

  2. 压缩(算法的核心)。

  3. 运行 Goldberg。

  4. 恢复对应到原图。

Abundant Arc

每轮算法的输入和输出都表示为 \((r, S, T)\),其中 \(r\) 是残余网络,\(C_{S, T}\) 是一组源汇割。可知在残余网络中至多还可以增长 \(c(S, T)\) 的流,记作流上限 \(\Delta=c(S, T)\)(和 Goldberg 中的 \(\Delta\) 同义)。

Abundant Arc: 若有一边 \(r(e)\ge 2\Delta\),则称其为 \(\Delta\)-Abundant Arc.

Theorem: 若在某轮算法中,输入为 \((r, S, T): \Delta\),输出为 \((r', S', T'): \Delta'\),且若 \(r(e)\ge 2\Delta\)\(\Delta\)-Abundant Arc,则在结束后,\(r'(e)\ge 2\Delta'\)\(\Delta'\)-Abundant Arc.

Proof: 设 \(e\) 增广了 \(x\),即 \(r(e)-r'(e)=x\),则有 \(\Delta'\le \Delta-x\)。故而

\[ \begin{align*} r'(e)&=r(e)-x\\ &\ge 2\Delta-x\\ &\ge 2(\Delta'+x)-x\\ &\ge 2\Delta' \end{align*} \]

故而 Abundant Arc 集合只会增加,不会减少。

收缩

对输入 \((r, S, T)\),可以先将 Abundant Arc 环收缩:在收缩后的图上的流,必然可以满足收缩前的图的流。

对于算法的 3. 运行 Goldberg,为了证明的方便,假设结束后的流 \(\Delta'\le \Delta/(8m)\)。可以发现复杂度只影响对数倍。

四类弧

把图中所有弧分为四类:

  • Little Arc(\(L\)):弧 \(\langle i, j\rangle\) 满足 \(c(\langle i, j\rangle) + c(\langle j, i\rangle)< \Delta/(64m^3)\).
  • Medium Arc(\(M\)): 弧 \(\langle i, j\rangle\) 满足上式 \(\ge \Delta/(64m^3)\),但正、反向弧都不是 Abundant Edge。
  • Abundant Arc(\(A\))。
  • Anti Abundant Arc(\(A'\)):反向弧在 \(A\) 中的弧。

注意到因为收缩后的图无 Abundant Arc 环,故一条边不能既在 \(A\) 中又在 \(A'\) 中。\(L, M, A, A'\) 构成了弧集的一个划分。

压缩 - 压缩掉一些顶点

如果一个顶点同时满足以下两个条件,则它可以被压缩(Compatible):

  • 与它相邻的边没有 Medium Arc;
  • 进入它的 Anti Abundant Arc 的残余容量和与离开它的相差不超过 \(\Delta/(16m^2)\)

换言之:一个顶点保留(是 Criticle)的条件是,满足以下条件之一

  • 与它相邻的边有 Medium Arc;
  • 进入它的 Anti Abundant Arc 的残余容量和与离开它的相差超过 \(\Delta/(16m^2)\)

直观理解,当一个顶点旁边的与 Abundant Arc 无关的边都是微不足道的时候,且 Anti Abundant Arc 流入和流出量基本相抵时,它是不重要的。

压缩 - 忽略掉一些路径

如果一条路径 \(P\) 中,存在某条 Little Arc: 则它可以增流的量至多为 \(\Delta/(64m^3)\),可以忽略。故只需考虑 \(P\) 经过 Medium Arc、Abundant Arc 和 Anti Abundant Arc。

Claim: \(P\) 中若存在 Anti Abundant Subpath 是以 Compatible 顶点为端点,则也可以忽略。

因此,只需考虑的路径是:仅包含 Medium Arc、Abundant Arc、Auti Abundant Path(以 Criticle 顶点为端点)的路径。

于是只需在 Criticle 顶点和以下三种边中运行 Goldberg 最大流算法: 当 \(i, j\) 都是 Criticle 时

  • Medium 边;
  • 伪 Abundant 弧:若在原图中存在 \(i\Rightarrow j\)Abundant Path,则有容量为 \(2\Delta\)\(\langle i, j\rangle\) 弧;
  • 伪 Anti Abundant 弧:若在原图中存在 \(i\Rightarrow j\) 的 Anti Abundant Path,则有容量为所有这样的路径的残余容量和的弧 \(\langle i, j\rangle\)

复杂度证明

Theorem: Criticle 顶点在全部 \(O(\log U)\) 轮算法中共 \(O(m)\) 个,故每轮平均 \(O(m/\log U)\),故开头的复杂度分析正确。

Proof: 注意到对于原图中的弧:

  • 对于 Medium Arc,在 \(3\) 次操作后一定会变成 Abundant Arc;
  • 对于所有相邻弧都不是 Medium Arc,但是因为"进入它的 Anti Abundant Arc 的残余容量和与离开它的相差超过 \(\Delta/(16m^2)\)"而不能被压缩的 Criticle 顶点,在 \(4\) 轮后一定会有一条 Anti Abundant Arc 变为 Abundant Arc,进而形成 Abundant Cycle 被收缩。

Dinic 算法

(尽管正确的名字可能是 Dinitz,但就这么叫了)

主要思想

每次对于残余网络 \(r\),进行一次 BFS,按照从 \(s\) 的距离得到分层图 \(r_d\)

对于 \(r_d\) 进行若干次 DFS,找出在 \(r_d\)阻塞流,即无法从 \(s\)\(t\) 得到更多的流(不考虑退流)。

1
2
3
4
5
6
7
8
9
10
def Dinic(r, s, t):
maxflow = 0
flow = 0
while bfs() gets a connective graph from s to t:
while True:
flow = dfs(s, INF)
maxflow += flow
if (flow == 0):
break
return maxflow

可以看到 Dinic 算法是 Ford-Fulkerson 增广的一种变种,正确性证明和 FF 算法相同,以下主要考虑其复杂度。

算法复杂度

Theorem 1:对于单轮的分层图,DFS 求出阻塞流的复杂度为 \(O(nm)\)

Theorem 2: Dinic 算法至多考虑 \(O(n)\) 次分层图。

Theorem 3: 从上述两个定理可知,Dinic 算法的总复杂度为 \(O(n^2m)\),但对于平均情况(以及特殊网络)有更好的复杂度。

特殊图上的复杂度

  • 若网络中全部弧的容量均为 \(1\),则 Dinic 算法的复杂度为 \(O(m\cdot \min\lbrace n^{2/3}, m^{1/2}\rbrace)\)

  • 若网络中全部弧的容量均为 \(1\),且除源点和汇点外的每个点均满足 \(d^-(u)=1\)\(d^+(u)=1\),则 Dinic 算法的复杂度为 \(O(m\sqrt n)\)

对于二分图最大匹配,注意到该复杂度与 Hopcroft-Karp 算法相同。实质上,两个算法的本质是相同的。

参考资料

[1] James B. Orlin. 2013. Max flows in O(nm) time, or better. In Proceedings of the forty-fifth annual ACM symposium on Theory of Computing (STOC '13). Association for Computing Machinery, New York, NY, USA, 765–774. https://doi.org/10.1145/2488608.2488705

[2] V. King, S. Rao, and R. Tarjan. A faster deterministic maximum flow algorithm. J. Algorithms, 23:447–474, 1994.

[3] A. V. Goldberg and S. Rao. Beyond the flow decomposition barrier. Journal of the ACM, 45:783–797, 1998.

[4] https://oi-wiki.org/graph/flow/max-flow/