一种可以在 O(mlog∣f∣(m+n)logm) 时间复杂度内求解最大流的诡异方法,其中 ∣f∣ 是最大流流量。方法名称是我自己胡乱翻译的,原名叫:The Fattest Augmenting Path Heuristic。
求解最大流通常使用的是 Ford-Fulkerson 方法,但是各个方法找增广路的方式有所区别。 Edmonds-Karp 找的是最短的增广路,Dinic 则是建立的分层图找增广路,还有其他更多的算法。
本文介绍的找增广路的方法是,找到路径上边权最小值最大的增广路,称为最大宽度增广路。
以下均假设图 G=(V,E,c,S,T),且 n=∣V∣,m=∣E∣,且容量限制均为整数(有理数与实数可以通过整数扩充)。
找到源点与汇点之间的最大宽度路径可以使用魔改 Dijkstra 最短路算法完成,时间复杂度为 O((m+n)logm)。
我们的首要任务是证明:
命题 1:这样找增广路径则增广次数为 O(mlog∣f∣) 级别,其中 ∣f∣ 为最大流流量。
为此我们先证明一个引理:
引理 1:对于任意一个流网络图 G=(V,E,c,S,T),设其最大流流量为 ∣f∣,则 G 中存在一条可行流流量至少是 ∣f∣/∣E∣。
证明:为证明此结论,我们尝试把最大流进行分解。
设图 G 的最大流为 f:E→R(也就是说 f 是一个映射,给出了最大流中边对应的流量),而最大流的流量为 ∣f∣。
我们按照如下方式讲流进行分解:
- 找到一条从 S 到 T 的路径 p,满足对于 p 中的任何边 e,f(e)>0。
- 记 d=e∈pminf(e),然后令所有 p 中的边的 f 减去 d。
- 如果此时残量网络中的最大流已经降为 0 则退出;否则回到第 1 步继续。
值得注意的是只要有当前残量网络的最大流大于 0,就一定可以找到这样的路径。
这样我们就分解出了若干个可行流 f1,f2,…,fk,这些流并起来是 f。
注意到每次找到一个 fi,都会使得至少一条边的 f 变为 0,所以 k≤∣E∣。
又因为 ∣f1∣+⋯+∣fk∣=∣f∣,所以存在一个 1≤i≤k,使得 ∣fk∣≥∣f∣/∣E∣,得证。□
那么这时再回到原命题:
证明:设第 i 次增广完当前的流量为 fi,对饮的残量网络为 Gi。则 Gi 上的最大流显然是 ri=∣f∣−fi。
根据引理 1 有:fi+1≥fi+2mri(除 2m 是因为残量网络上是有反向边的)。
所以:ri+1=∣f∣−fi+1≤∣f∣−fi−2mri=ri(1−2m1)。
初始时有:f0=0,r0=∣f∣,所以:
ri≤r0(1−2m1)2=∣f∣(1−2m1)2≤∣f∣e−i/2m
故当 i>2mln∣f∣ 时有 ri<1,又因为 ri 是整数,所以 ri=0。
所以增广次数级别为 O(mlog∣f∣),得证。□
其实上述证明方法还可以用来证明集合覆盖朴素贪心解法的近似优越性。
集合覆盖问题如下:给定正整数 n 与集合 {1,2,…,n} 的 m 个子集 S1,S2,…,Sm,找到最少的集合,使得其全部并起来是 {1,2,…,n}。
朴素的贪心想法就是选择当前可以新覆盖最多点的集合,以下命题说明这一算法的近似优越性。
命题 2:如果最优解要取 k 个集合,则使用如上贪心策略取的集合数量不会超过 klnn。
证明:记 ri 为执行完第 i 步后还未被覆盖的点个数。则因为最优解是 k,所以一定有一个集合覆盖了其中至少 ri/k 个点。那么之后的证明和命题 1 的证明无二致。□
实际上根据 PCP 理论,我们有:任何多项式算法都不可能得到上界为 o(klnn) 的解,除非 P=NP。
参考文献
[1] From Standford University,
site: https://theory.stanford.edu/~trevisan/cs261/lecture10.pdf.
[2] From Standford University,
site: https://theory.stanford.edu/~trevisan/cs261/lecture11.pdf.