前言
本文介绍Ford-Fulkerson的三个重要思想:残余网络、增广路径、割,Ford-Fulkerson是一种迭代方法,首先对所有的 u , v ∈ V , f ( u , v ) = 0 u,v\in V,f(u,v)=0 u,v∈V,f(u,v)=0,即初始状态时流的值为0;每次迭代都在残余网络中找到一条从源点 s s s到汇点 t t t的增广路径,反复进行这一步骤,直到所有的增广路径都被找出。下面具体讲述一下算法流程。
残余网络
残余网络是指给定一个网络和当前流值,其余可以容纳的流组成的网络,我们首先定义每条边的残余容量。具体来说,对于图
G
=
(
V
,
E
)
G=(V,E)
G=(V,E),其源点
s
s
s,汇点
t
t
t。设
f
f
f为
G
G
G中对应定点
u
u
u到
v
v
v的一个流。在不超过
C
(
u
,
v
)
C(u,v)
C(u,v)的条件下(
C
C
C代表最大容量),从
u
u
u到
v
v
v的残余容量定义为:
r
(
u
,
v
)
=
C
(
u
,
v
)
−
f
(
u
,
v
)
r(u,v)=C(u,v)-f(u,v)
r(u,v)=C(u,v)−f(u,v)。
举个例子,若当前边
(
u
,
v
)
(u,v)
(u,v)为3/4,即
C
(
u
,
v
)
=
4
,
f
(
u
,
v
)
=
3
C(u,v)=4,f(u,v)=3
C(u,v)=4,f(u,v)=3,那么
r
(
u
,
v
)
=
4
−
3
=
1
r(u,v)=4-3=1
r(u,v)=4−3=1。
接下来引入网络流中的一条规律:若
f
(
u
,
v
)
=
3
f(u,v)=3
f(u,v)=3,那么从反方向看,从
v
v
v到
u
u
u就有三个单位的残余网络,即
r
(
v
,
u
)
=
3
r(v,u)=3
r(v,u)=3。通俗的来说,从
u
u
u到
v
v
v有三个单位的流量,那么从
v
v
v到
u
u
u就有了将这三个单位流量压回去的能力。如下图例子:
其对应的残余网络为:
增广路径
已经一个网络
G
G
G和流
f
f
f,增广路径
p
p
p其实是
G
G
G的残余网络
G
′
G'
G′中从
s
s
s到
t
t
t的一条简单路径。直观理解就是一条从
s
s
s到
t
t
t存在一条不违反容量的路径,将这条路径压入流量,可以增加整个网络的流值,例如上图的残余网络总,存在一条如下的增广路径:
这条增广路径可以压入4个单位的流量,压入后,我们得到一个新的流网络,其流量比原来的流网络要多4个,这时我们继续在新的网络上用同样的方法寻找增广路径,直到找不到为止,这时我们就得到了一个最大的流网络。
最大流最小割定理
以上为Ford-Fulkerson方法,但是怎么证明当无法再寻找到增广路径时,当前网络就是最大流网络呢?这就需要用到最大流最小割定理。
首先介绍割的概念,流网络
G
(
V
,
E
)
G(V,E)
G(V,E)的割
(
S
,
T
)
(S,T)
(S,T)将顶点
V
V
V划分为
S
S
S和
V
−
S
V-S
V−S两部分,使得源点
s
s
s属于
S
S
S,汇点属于
T
T
T。割
(
S
,
T
)
(S,T)
(S,T)的容量是指从集合
S
S
S到
T
T
T的所有有向边的容量之和(注意不含反方向的,必须是
S
S
S到
T
T
T);如果
f
f
f是一个流,则穿过割
(
S
,
T
)
(S,T)
(S,T)的净流量定义为
f
(
S
,
T
)
f(S,T)
f(S,T)(包括反方向的,
S
S
S到
T
T
T为正值,反之为负值)。如下面的一个割:
割的容量为 c ( u , w ) + c ( v , x ) = 26 c(u,w)+c(v,x)=26 c(u,w)+c(v,x)=26;流网络穿过割的净流量为 f ( u , w ) + f ( v , x ) − f ( w , v ) = 19 f(u,w)+f(v,x)-f(w,v)=19 f(u,w)+f(v,x)−f(w,v)=19,显然对任意的割,穿过该割的净流量上界就是该割的容量,所以网络的最大流必然无法超过网络的最小割。
回到问题本身,残留网络上的增广路径和最小割有什么关系呢?
根据流网络流量守恒的原则,对网络的任意割,其净流量都是相等的。下面再画另一个割:
在该割中,从源点 s s s到集合 T T T的净流量都流向了 u u u和 v v v,而在上个割中,集合 S S S到 T T T的流量等于 u u u和 v v v到集合 T T T的净流量的。其中, w w w也有流流向了 v v v,而这部分流无法流向源点 s s s,因为没有路径,所以这部分流量加上 s s s到 u u u和 v v v的流量,在 u u u和 v v v之间无论这么传递,最终都要流向集合 T T T,所以这个流向值是等于 s s s流向 u u u和 v v v的。将 s s s比喻成一个水龙头, u u u和 v v v为流向别处的水流,都是来自 s s s的,其自身不可能创造水流。综上,任意割的净流量都是相等的。
下面再来证明残余网络
G
′
G'
G′中,不含增广路径时,
f
f
f是
G
G
G的最大流。
假设
G
′
G'
G′中不包含增广路径,定义
S
S
S集合为
G
′
G'
G′中
s
s
s能够有通路到达的点的集合,显然这个集合不包括汇点
t
t
t,因为此时
s
s
s到
t
t
t没有通路,令
T
=
V
−
S
T=V-S
T=V−S。显然$(S,T)是一个割,如下图所示:
那么对于顶点 u ∈ S , v ∈ T u\in S, v\in T u∈S,v∈T,有 f ( u , v ) = c ( u , v ) f(u,v)=c(u,v) f(u,v)=c(u,v)。否则 ( u , v ) (u,v) (u,v)存在残余流量,因而 s s s到 u u u加上 u u u到 v v v就构成了 s s s到 v v v的通路,所以 v ∈ S v\in S v∈S,这与定义矛盾,因而当前流 f f f等于当前割的容量,因此 f f f就是最大流。