最大流学习笔记
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)$
以上是关于最大流学习笔记的主要内容,如果未能解决你的问题,请参考以下文章