黄文睿
221180115 计算机拔尖班
[1] (Orlin, 2013) 给出了一种在任意图上 $O(nm)$ 的网络最大流算法。
[1] 中的若干证明用到了一些前置结果:
可以发现,需要攻克的仅在于 $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). $$
$$ T(n)=\tilde O(m^{1/2}\cdot m\cdot m^{7/16})=\tilde O(m^{31/16}), $$
已然满足条件。
$$ \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)$ 构成,每轮的步骤是:
收缩(comtraction)。
压缩(算法的核心)。
运行 Goldberg。
恢复对应到原图。
每轮算法的输入和输出都表示为 $(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$。故而
$$ r'(e)=r(e)-x \ge 2\Delta-x \ge 2(\Delta'+x)-x \ge 2\Delta', $$
故而 Abundant Arc 集合只会增加,不会减少。
对输入 $(r, S, T)$,可以先将 Abundant Arc 环收缩:在收缩后的图上的流,必然可以满足收缩前的图的流。
对于算法的 3. 运行 Goldberg,为了证明的方便,假设结束后的流 $\Delta'\le \Delta/(8m)$。可以发现复杂度只影响对数因子。
把图中所有弧分为四类:
注意到因为收缩后的图无 Abundant Arc 环,故一条边不能既在 $A$ 中又在 $A'$ 中。$L, M, A, A'$ 构成了弧集的一个划分。
如果一个顶点同时满足以下两个条件,则它可以被压缩(Compatible):
换言之:一个顶点保留(是 Criticle)的条件是,满足以下条件之一:
直观理解,当一个顶点旁边的与 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 时
Theorem: Criticle 顶点在全部 $O(\log U)$ 轮算法中共 $O(m)$ 个,故每轮平均 $O(m/\log U)$,故开头的复杂度分析正确。
Proof: 注意到对于原图中的弧:
(尽管正确的名字可能是 Dinitz,但就这么叫了)
每次对于残余网络 $r$,进行一次 BFS,按照从 $s$ 的距离得到分层图 $r_d$。
对于 $r_d$ 进行若干次 DFS,找出在 $r_d$ 上 阻塞流,即无法从 $s$ 到 $t$ 得到更多的流(不考虑退流)。
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.