最大流学习笔记

Posted Only the Strong Survive

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最大流学习笔记相关的知识,希望对你有一定的参考价值。

1 基本的Ford-Fulkerson方法。该方法的思想就是每次找到一个增广路$p$,然后将增广路 $p$对应的流加到之前的流上得到新的流,一直这样直到找不到增广路,这时候找到的流就是最大流。

算法的伪代码如下

技术分享

假设容量是整数,最大流为$f^{*}$,那么while循环最多执行$|f^{*}|$次,因为每次至少使得流量增加1,每次找增光路的代价是$O(E)$,所以总的复杂度是$O(E|f^{*}|)$

 

2 Edmonds-Karp算法。Edmonds-Karp算法是对Ford-Fulkerson的改进,具体就是每次找增广路时找的是s到t的最短路(路径边长为1)。设$\delta_{f}(u,v)$表示残存网络中从$u$到$v$的最短路径

 

3 如果Edmonds-Karp算法运行在流网络G上,那么对所有的节点$v\in V-\{s,t\}$,残存网络$G_{f}$中的最短路径距离$\delta_{f}(s,v)$随着每次流量的递增而单调递增。

 

4 如果Edmonds-Karp算法运行在流网络G上,则该算法所执行的流量递增的总次数为$O(VE)$

 

5 Edmonds-Karp算法每次找最短路径的复杂度是$O(E)$,所以总的复杂度是$O(VE^{2})$

 

以下为证明

3的证明

假设对于某个节点$v\in V-\{s,t\}$,存在一个流量递增的操作使得源点到$v$的距离变小了。设$f$是最短路径减少之前的流量,对应的残存网络为$G_{f}$,$f^{‘}$是递增之后的流量,对应的残存网络为$G_{f^{‘}}$,设$v$为在所有最短距离减少的节点中,$\delta_{f^{‘}}(s,v)$最小的节点。有$\delta_{f^{‘}}(s,v)<\delta_{f}(s,v)$。

设$p=s\sim u\rightarrow v$为残存网络$G_{f^{‘}}$中从源节点s到$v$的一条最短路径,因此$(u,v)\in G_{f^{‘}}$,并且$\delta_{f^{‘}}(s,u)=\delta_{f^{‘}}(s,v)-1$

源节点到$u$的距离没有减少,所以$\delta_{f^{‘}}(s,u)\geq \delta_{f}(s,u)$

那么一定有$(u,v)\notin E_{f}$,否则:

$\delta_{f}(s,v)\leq \delta_{f}(s,u)+1$

$\leq \delta_{f^{‘}}(s,u)+1$

$=\delta_{f^{‘}}(s,v)$

这与$\delta_{f^{‘}}(s,v)<\delta_{f}(s,v)$矛盾。

那么现在$(u,v)\notin E_{f}$但是$(u,v)\in E_{f^{‘}}$,这一递增操作一定是增加了$v$到$u$的流量。又因为Edmonds-Karp算法总是沿着最短路径增加流,所以在$G_{f}$中从s到$u$的最短路径上的最后一条边是$(v,u)$,所以

$\delta_{f}(s,v)=\delta_{f}(s,u)-1$

$\leq \delta_{f^{‘}}(s,u)-1$

$=\delta_{f^{‘}}(s,v)-2$

这与$\delta_{f^{‘}}(s,v)<\delta_{f}(s,v)$矛盾。所以一开始的假设是不正确的。

 

4的证明

在$G_{f}$中,如果一条路径$p$的残存容量是该路径上的边$(u,v)$的残存容量,即$c_{f}(p)=c_{f}(u,v)$,那么我们称$(u,v)$为关键边。下面首先证明对于每条边来说,成为关建边的次数最多为$\frac{|V|}{2}$

当$(u,v)$第一次成为关键边时有$\delta_{f}(s,v)=\delta_{f}(s,u)+1$

之后边$(u,v)$将从残存网络中消失。到下一次$(u,v)$成为关键边时,一定在之前$(v,u)$出现在了路径$p$上,假设这一事件发生时$f^{‘}$是G的流,那么有

$\delta_{f^{‘}}(s,u)=\delta_{f^{‘}}(s,v)+1$

由于$\delta_{f}(s,v)\leq \delta_{f^{‘}}(s,v)$

那么有$\delta_{f^{‘}}(s,u)=\delta_{f^{‘}}(s,v)+1\geq \delta_{f}(s,v)+1=\delta_{f}(s,u)+2$,也就是到$u$的距离增加了至少2

初始时到$u$的距离至少为0,最后到$u$的距离最多为$|V|-2$($(u,v)$出现在增广路径上意味着$u\neq t$,同时$u\neq s$).所以在$(u,v)$第一次成为关建边后还最多能成为$\frac{|V|-2}{2}=\frac{|V|}{2}-1$次关建边,所以一共最多成为$\frac{|V|}{2}$次关建边。

一共有$|E|$条边,所以一共有最多$\frac{|V||E|}{2}$条关建边,每条增广路至少出现一条关建边,所以总次数为$O(VE)$

以上是关于最大流学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

算法学习笔记(8.1): 网络最大流算法 EK, Dinic, ISAP

最大流学习笔记-推送重贴标签算法一

算法学习笔记(8.2): 上下界网络流

最大流学习笔记-前置重贴标签算法一

Java学习笔记之 IO包 字节流

IO流学习笔记