流网络
网络流G=(v, E)是一个有向图,其中每条边(u, v)均有一个非负的容量值,记为c(u, v) ≧ 0。如果(u, v) ∉ E则可以规定c(u, v) = 0。网络流中有两个特殊的顶点,即源点s和汇点t。
流的定义
与网络流相关的一个概念是流。设G是一个流网络,其容量为c。设s为网络的源点(source),t为汇点(sink),那么G的流是一个函数f:V×V →R,满足以下性质:
- 容量限制: 对每条边e ∈ E :0<=f(e)<=c(e)
- 流守恒性:对每个顶点v ∈ V-{s,t}:
定义:流的值为:
如图:
最大流问题
就是在容量容许的条件下,从源点到汇点所能通过的最大流量
在这之前,先看几个定义。
增广路径
定义:增广路径是找出在残留网络中从源点到汇点的有向路径。增广路径的残留容量是路径中任意边所形成的最小残留容量。显然,我们可以沿着增广路径从源点到汇点发送额外的流。

通过寻找增广路径,我们可以迭代的增加流的值
如何寻找增广路径?
在残量图中找
残量图
定义:
- 原边:e=(u,v)∈E,有流 f(e),容量 c(e)
残量边:
- 前向边:e=(u,v)∈E,当f(e)<c(e)
- 反向边:
,当f(e)>0
- 残量容量:
残量图:
- 残量边有正的残余容量
Ford-Fulkerson算法伪代码
bottleneck是一条路径中最小的那个容量
构造残量图不用真的构造,有trick(俺也不知道,等俺想到了补上)
Augment(f,c,P)
b=bottleneck(P)
for each e ∈ P
if (e∈E) f(e)=f(e)+b
else f(eR)=f(e)-b
return f
Ford-Fulkerson(G,c,s,t)
{
for each e∈E f(e)=0
Gf= residual graph
while(there exists augmenting path P in Gf)
f=Augment(f,c,P)
update Gf
return f
}
证明算法正确性
算法中while循环是否会终止
- 假定:所有的容量都是整数
- 声明1:f是G中的一个流,P是
(残量图)中s到t的一条简单路径。则
v(f')=v(f)+bottleneck(P,f)
并且只要bottleneck(P,f)>0,则有v(f')>v(f)
- 声明2:Ford-Fulkerson算法的while循环最多终止在
,即s输出的容量和,不可能更大,但可能更小
实数可以作为容量吗?
在实际应用中,容量一般是整数和有理数。如果容量带小数,可能会遇到循环多次,每次流只增加一点点,循环很难结束的情况
证明算出来的最大流是正确的
引入割的概念
割(cuts)
定义:是网络中顶点的一个划分,把所有顶点划分成两个顶点集合A和B,其中源点s属于A,汇点t属于B,记作(A,B)
割的容量的定义:所有正向割边的容量和,不同割的容量不同,即

最小割问题
即为求一个最小容量的割
证明求最小割和求最大流是一样的
流值引理(Flow value lemma)
设f是任意s到t的流,(A,B)是任意s到t的割,则经过割的净流量等于s输出的流量
如图,三个割的净流量都是等于s输出的流量24
证明:
弱对偶性(Weak duality)
设f是任意s到t的流,(A,B)是任意s到t的割,则流的最大值最多能到割的容量,即v(f)<=cap(A,B)
证明:
最佳选择证明
推论:设f是任意s到t的流,(A,B)是任意s到t的割,如果v(f)=cap(A,B),则f是最大流,(A,B)是最小割
最大流最小割定理
最大流的值等于最小割的值
增广路径定理
f是s到t的最大流当且仅当没有增广路径时
证明策略:这三个性质可以相互推导
(1)存在一个割(A,B)满足v(f)=cap(A,B)
(2)流f是最大流
(3)没有与f有关的增广路径
(1)推导(2):弱对偶性的推论(不懂……)
(2)推导(3):反证法:如果f存在增广路径,则f还可以增长,则f不是最大流
(3)推导(1):
构造性证明,对条件(3),求出割(A,B)满足v(f)=cap(A,B)
设流f没有增广路径
设A是残量图
中从源点s出发的一系列可达的顶点的集合
进入A的边f(e)=0,从A出来的边的f(e)等于c(e)
反推:
如果一条边进入A且f(e)不为0,那么这条边的起点应该在A里
如果一条边从A出来且f(e)不等于c(e),那么这条边的终点也在A里(俺也没明白,到底啥意思啊……)
如何求最小割
-
那么如何来求出最小割的其中一种方案呢,我们在进行最大流计算完成之后,从原点进行遍历整张图,将遍历到的点标记为
true
;最终结束之后,所有标记为true
的点和没有标记的点之间就是一个割边。 -
那么为什么求出来的就是割边呢,因为最大流之后,所有通路在满流的那条通道处断掉了,也就是没有办法继续走下去,而这条通道一边标记为了
true
另一边没有被标记,那么他们之间就是一个割边了。
时间复杂度
- 完整性定理:如果所有的容量都是整数,那么最大流也是整数
证明很简单,因为每次求路径p的瓶颈肯定是整数,求残量图的容量也是整数,再求增广路径上的容量也还是整数,所以最大流一定是整数
- Ford-Fulkerson算法的时间复杂度取决于增广路径如何决定
- 如果所有的容量都是整数,有一个Ford-Fulkerson算法的直接实现的时间复杂度O(|E||f*|),其中f*由算法决定
- Edmonds Karp 算法是 Ford Fulkerson 方法的一种具体实现。它采用 BFS 搜索方法在剩余网络中寻找一条增广路径。具体做法是先对每条边的权值统一赋值为 1 ,然后找一条从 s 到 t的最短路径。基于此方法, Edmonds Karp 算法求最大流的时间为