流网络
一个流网络首先是一个有向图 G=(V,E),流网络的每条边 (u,v)∈E 都有一个容量 c(u,v),当 (u,v)∈/E 时 c(u,v)=0;流网络中都有一个源点 s∈V 和一个汇点 t∈V,且 s=t.
可行流
设 f(u,v) 定义在二元组 (u∈V,v∈V) 上的实值函数,且满足
- 容量限制:0≤f(u,v)≤c(u,v)(当 (u,v)∈/E 时,f(u,v)=0.)
- 流量守恒:∀x∈V−{s,t},∑v∈Vf(v,x)=∑v∈Vf(x,v)
f(u,v) 表示从结点 u 到结点 v 的流, 一个流 f 的值定义为 ∣f∣=∑v∈Vf(s,v)−∑v∈Vf(v,s).
最大流 问题指给定一个流网络 G,一个源点 s,一个汇点 t,找到值 最大 的一个流。
残留网络
对于流网络 G=(V,E) 中的一个可行流 f,残留网络 Gf=(Vf,Ef),其中 Vf=V,Ef 包括 E 和 E 中所有边的反向边,残留网络中边的容量为
cf(u,v)=⎩⎨⎧c(u,v)−f(u,v)f(v,u)0(u,v)∈E(v,u)∈Eelse
如果 f 是 G 中的一个可行流,f′ 是对应的残留网络 Gf 中的一个可行流,定义 f↑f′ 为流 f′ 对流 f 的递增
(f↑f′)(u,v)=f(u,v)+f′(u,v)−f′(v,u)(u,v)∈E
其他情况下 (f↑f′)(u,v)=0,首先,我们证明 f↑f′ 是 G 中的一个可行流。
对于容量限制,注意到,如果边 (u,v)∈E,则 f′(v,u)≤cf(v,u)=f(u,v),则有
(f↑f′)(u,v)=f(u,v)+f′(u,v)−f′(v,u)≥f(u,v)+f′(u,v)−f(u,v)=f′(u,v)≥0(f↑f′)(u,v)=f(u,v)+f′(u,v)−f′(v,u)≤f(u,v)+f′(u,v)≤f(u,v)+cf(u,v)=f(u,v)+c(u,v)−f(u,v)=c(u,v)
对于流量守恒,因为 f 和 f′ 都满足流量守恒,对于任意的结点 x∈V−{s,t},有
v∈V∑(f↑f′)(x,v)=v∈V∑(f(x,v)+f′(x,v)−f′(v,x))=v∈V∑f(x,v)+v∈V∑f′(x,v)−v∈V∑f′(v,x)=v∈V∑f(v,x)+v∈V∑f′(v,x)−v∈V∑f′(x,v)=v∈V∑(f(v,x)+f′(v,x)−f′(x,v))=v∈V∑(f↑f′)(v,x)
然后,我们来计算可行流 f↑f′ 的值。定义 V1={v∣(s,v)∈E},V2={v∣(v,s)∈E},那么显然有 V1∪V2⊆V,V1∩V2=∅,则有
∣f↑f′∣=v∈V∑(f↑f′)(s,v)−v∈V∑(f↑f′)(v,s)=v∈V1∑(f↑f′)(s,v)−v∈V2∑(f↑f′)(v,s)
代入 f↑f′ 的定义,可以得到
∣f↑f′∣=v∈V1∑(f(s,v)+f′(s,v)−f′(v,s))−v∈V2∑(f(v,s)+f′(v,s)−f′(s,v))=v∈V1∑f(s,v)+v∈V1∑f′(s,v)−v∈V1∑f′(v,s)−v∈V2∑f(v,s)−v∈V2∑f′(v,s)+v∈V2∑f′(s,v)=v∈V1∑f(s,v)−v∈V2∑f(v,s)+(v∈V1∑f′(s,v)+v∈V2∑f′(s,v))−(v∈V1∑f′(v,s)+v∈V2∑f′(v,s))=v∈V1∑f(s,v)−v∈V2∑f(v,s)+v∈V1∪V2∑f′(s,v)−v∈V1∪V2∑f′(v,s)=v∈V∑f(s,v)−v∈V∑f(v,s)+v∈V∑f′(s,v)−v∈V∑f′(v,s)=∣f∣+∣f′∣
注意到,最后将求和项的求和范围都扩展到 V,这是因为其他项的值均为 0.(边不属于 E 或 Ef)
增广路径
给定流网络 G=(V,E) 和可行流 f,在残留网络 Gf 中,从源点 s 出发,沿着容量 大于 0 的边,如果能够走到汇点 t,那么这条路径 p 就称为增广路径。增广路径 p 的 残留容量 定义为 p 上能够为每条边增加的流量的最大值,表达式为
cf(p)=min{cf(u,v)∣(u,v)∈p}
对于 Gf 中的增广路径 p,定义流 fp 表示一个对流 f 的可行增量,使其更接近最大流
fp(u,v)=cf(p)(u,v)∈p
其他情况下 fp(u,v)=0,显然,fp 是残留网络 Gf 的一个可行流,且 ∣fp∣=cf(p)>0.
割
流网络 G=(V,E) 中的一个割 (S,T) 将结点集 V 划分为 S 和 T=V−S 两个集合,使得 s∈S,t∈T,则显然有 S∪T=V,S∩T=∅,割 (S,T) 的容量 定义为
c(S,T)=u∈S∑v∈T∑c(u,v)
割 (S,T) 的流量 定义为
f(S,T)=u∈S∑v∈T∑f(u,v)−u∈S∑v∈T∑f(v,u)
最小割 问题指给定一个流网络 G,一个源点 s,一个汇点 t,找到值 最小 的一个割。
流与割的关系
给定一个流网络 G=(V,E),一个源点 s,一个汇点 t;首先我们需要证明,对于流网络 G 中的一个可行流 f,对于流网络 G 的任意的割 (S,T),都有 f(S,T)=∣f∣.
根据割的流量的定义式,对于互斥的任意结点集 X,Y,Z,显然有 f(X,Y)=−f(Y,X),f(X,X)=0,
f(Z,X∪Y)=u∈Z∑v∈X∪Y∑f(u,v)−u∈Z∑v∈X∪Y∑f(v,u)=u∈Z∑(v∈X∑f(u,v)+v∈Y∑f(u,v))−u∈Z∑(v∈X∑f(v,u)+v∈Y∑f(v,u))=u∈Z∑v∈X∑f(u,v)−u∈Z∑v∈X∑f(v,u)+u∈Z∑v∈Y∑f(u,v)−u∈Z∑v∈Y∑f(v,u)=f(Z,X)+f(Z,Y)
由于 S∪T=V,S∩T=∅,则有
f(S,V)f(S,T)=f(S,S)+f(S,T)=f(S,V)−f(S,S)=f(S,V)=f({s},V)+f(S−{s},V)
由于 S 中首先没有汇点 t,则 S−{s} 不包含源点和汇点,流量守恒,则有
f(S−{s},V)=u∈S−{s}∑v∈V∑f(u,v)−u∈S−{s}∑v∈V∑f(v,u)=u∈S−{s}∑(v∈V∑f(u,v)−v∈V∑f(v,u))=0
所以有 f(S,T)=f({s},V)=∑v∈Vf(s,v)−∑v∈Vf(v,s)=∣f∣.
根据上述结论,我们可以容易地证明流网络 G 中任意可行流 f 的值 ∣f∣=f(S,T) 不超过 G 中任意割 (S,T) 的容量 c(S,T).
f(S,T)=u∈S∑v∈T∑f(u,v)−u∈S∑v∈T∑f(v,u)≤u∈S∑v∈T∑f(u,v)≤u∈S∑v∈T∑c(u,v)=c(S,T)
最大流最小割定理
设 f 是流网络 G=(V,E) 的一个可行流,流网络 G 的源点为 s,汇点为 t,则下列条件是等价的
- 可行流 f 是流网络 G 的一个最大流
- 可行流 f 的残留网络 Gf 不存在增广路径
- 存在某个割 (S,T) 使得 ∣f∣=c(S,T)
首先证明 1⇒2,用反证法,假设 f 是 G 的一个最大流,残留网络 Gf 包含一条增广路径 p,显然有 ∣fp∣>0,则 ∣f+fp∣=∣f∣+∣fp∣>∣f∣,这与 f 是最大流矛盾。
证明 2⇒3,定义集合 S 表示在残留网络 Gf 中,从源点 s 出发,沿着容量大于 0 的边走,所有能走到的结点的集合;集合 T=V−S,显然 s∈S,由于 Gf 不存在增广路径,t∈/S,则 t∈T,所以 (S,T) 是流网络 G 的一个割。
考虑一对结点 u∈S,v∈T;如果 (u,v)∈E,则有 f(u,v)=c(u,v);因为如果 f(u,v)<c(u,v),在 Gf 中,cf(u,v)=c(u,v)−f(u,v)>0,则结点 v 应当属于 S,矛盾。
如果 (v,u)∈E,则有 f(v,u)=0;若 f(v,u)>0,在 Gf 中,cf(u,v)=f(v,u)>0,则 v 应属于 S,矛盾。
对于 (u,v)∈/E 并且 (v,u)∈/E 的情况,显然有 f(u,v)=f(v,u)=0,则有
∣f∣=f(S,T)=u∈S∑v∈T∑f(u,v)−u∈S∑v∈T∑f(v,u)=u∈S∑v∈T∑c(u,v)=c(S,T)
最后证明 3⇒1,对于所有可行流 f,对于所有的割 (S,T),都有 ∣f∣≤c(S,T),因此,条件 ∣f∣=c(S,T) 蕴含了 f 是一个最大流。(同时也说明了流网络的最大流的流量等于最小割的容量)