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上,那么对所有的节点$vin V-{s,t}$,残存网络$G_{f}$中的最短路径距离$delta_{f}(s,v)$随着每次流量的递增而单调递增。
4 如果Edmonds-Karp算法运行在流网络G上,则该算法所执行的流量递增的总次数为$O(VE)$
5 Edmonds-Karp算法每次找最短路径的复杂度是$O(E)$,所以总的复杂度是$O(VE^{2})$
以下为证明
3的证明
假设对于某个节点$vin V-{s,t}$,存在一个流量递增的操作使得源点到$v$的距离变小了。设$f$是最短路径减少之前的流量,对应的残存网络为$G_{f}$,$f^{'}$是递增之后的流量,对应的残存网络为$G_{f^{'}}$,设$v$为在所有最短距离减少的节点中,$delta_{f^{'}}(s,v)$最小的节点。有$delta_{f^{'}}(s,v)<delta_{f}(s,v)$。
设$p=ssim u ightarrow 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) otin 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) otin 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)+1geq delta_{f}(s,v)+1=delta_{f}(s,u)+2$,也就是到$u$的距离增加了至少2
初始时到$u$的距离至少为0,最后到$u$的距离最多为$|V|-2$($(u,v)$出现在增广路径上意味着$u eq t$,同时$u eq s$).所以在$(u,v)$第一次成为关建边后还最多能成为$frac{|V|-2}{2}=frac{|V|}{2}-1$次关建边,所以一共最多成为$frac{|V|}{2}$次关建边。
一共有$|E|$条边,所以一共有最多$frac{|V||E|}{2}$条关建边,每条增广路至少出现一条关建边,所以总次数为$O(VE)$