基本概念:
网络:(1)有一个源点 s 和汇点 t 。
(2)每一条有向边e=(u,v)都有一个容量限制记做c(e)。
流:定义在网络弧集上的实值函数 f ,满足三个性质
(1)对任意的弧 0 <= f <= c(e),容量限制。
(2)f(u,v) == -f(v,u),反对称性。
(3)流守恒性:除源汇点外,其余顶点都是过度点,流进顶点的流总和等于流出顶点的流总和。
残余网络:用e表示网络中的边,e' 表示残余网络中的边,残余网络中的边由以下两种构成:
(1)若f(e) < c(e) ,e=(u,v),则e' =(u,v)容量为 c(e) - f(e)
(2)若f(e)>0,e=(u,v),则加入边 e'=(v,u),容量为 f(e)
其中有(1)生成的边表示沿着这条边还能推进多少流;由(2)生成的边表示沿着该边的逆方向能退回多少流。
增广路: 定义增广路 P 是在残余网络上的一条从源点 s 到汇点 t 的简单路径,路径的残余流量为该边上的边 e' 容量的最小值,其实就是残余网络上增广的流值大于 0 的一条路径。
割的定义:设网络G,如果 X 是 V 的顶点子集,Y 是 X 的补集,即 Y = V - X,且满足 源点 属于X,汇点 属于 Y。则称K=(X,Y)为网络 G 的割,K的容量记为 cap(K) 最小割就是该网络中流量最小的割。
最小割最大流定理:
指在一个网络流中,能够从源点到达汇点的最大流量 等于 如果从网络中移除就能够导致网络流中断的边的集合的最小容量和。即在任何网络中,最大流的值等于最小割的容量
完整描述:下面给出的三个定理是等价的
(1)f 是 G 的最大流 (2)残余网络不包含增广路径 (3)对于图的某个割K=(X,Y),最大流=cap(K)
最大流问题: 在不超过个边容量限制的情况下,求源点到汇点的最大流量
Ford-Fulkson算法思想:
(1)初始化网络中所有边的容量,c(u,v)表示边的容量,c(v , u)=0 边(v,u)为回退边
(2)在残量网络中找一条从源点到汇点的增广路P,找到进行(3)否则进行(5)
(3)在增广路中找到路径中容量最小的边 X,累加到最大流中。
(4)将增广路中所有的c(u,v)减去 X ,所有的c(v,u)加上X,构成新的残余网络,转步骤(2)
(5)得到最大流,退出
《算法导论》中将Ford-Fulkson归结为一种方法而非算法,也许正是因为(2)中为给出寻找增广路的具体方法。
而能否高效的寻找到增广路是判断各算法优劣的主要依据。
根据刘汝佳大大在书中的建议:理解Ford-Fulkson算法的原理,比赛中使用Dinic或者ISAP(当做黑盒算法)
dinic模板链接:模板
最大费用最小流:每条边除了有一个容量限制外,还有所需要的费用。而要达到的是总流量最大的前提下,总费用最小的流。
MCMF模板链接:模板