最大流与最小割

145 阅读3分钟

流网络

一个流网络首先是一个有向图 G=(V,E)G=(V,E),流网络的每条边 (u,v)E(u,v)\in E 都有一个容量 c(u,v)c(u,v),当 (u,v)E(u,v)\notin Ec(u,v)=0c(u,v)=0;流网络中都有一个源点 sVs\in V 和一个汇点 tVt\in V,且 sts\ne t.

可行流

f(u,v)f(u,v) 定义在二元组 (uV,vV)(u\in V,v\in V) 上的实值函数,且满足

  • 容量限制:0f(u,v)c(u,v)0\leq f(u,v)\leq c(u,v)\qquad(当 (u,v)E(u,v)\notin E 时,f(u,v)=0f(u,v)=0.)
  • 流量守恒:xV{s,t},vVf(v,x)=vVf(x,v)\forall x\in V-\{s,t\},\sum_{v\in V}f(v,x)=\sum_{v\in V} f(x,v)

f(u,v)f(u,v) 表示从结点 uu 到结点 vv 的流, 一个流 ff 的值定义为 f=vVf(s,v)vVf(v,s)|f|=\sum_{v\in V}f(s,v)-\sum_{v\in V}f(v,s).

最大流 问题指给定一个流网络 GG,一个源点 ss,一个汇点 tt,找到值 最大 的一个流。

残留网络

对于流网络 G=(V,E)G=(V,E) 中的一个可行流 ff,残留网络 Gf=(Vf,Ef)G_f=(V_f,E_f),其中 Vf=VV_f=VEfE_f 包括 EEEE 中所有边的反向边,残留网络中边的容量为

cf(u,v)={c(u,v)f(u,v)(u,v)Ef(v,u)(v,u)E0elsec_{f}(u,v)=\left\{\begin{array}{ll}c(u,v)- f(u,v) & (u,v)\in E\\ f(v,u) & (v,u)\in E\\ 0 & \text{else} \end{array}\right.

如果 ffGG 中的一个可行流,ff^{\prime} 是对应的残留网络 GfG_f 中的一个可行流,定义 fff\uparrow f^{\prime} 为流 ff^{\prime} 对流 ff 的递增

(ff)(u,v)=f(u,v)+f(u,v)f(v,u)(u,v)E(f\uparrow f^{\prime})(u,v)=f(u,v)+f^{\prime}(u,v)-f^{\prime}(v,u)\qquad (u,v)\in E

其他情况下 (ff)(u,v)=0(f\uparrow f^{\prime})(u,v)=0,首先,我们证明 fff\uparrow f^{\prime}GG 中的一个可行流。

对于容量限制,注意到,如果边 (u,v)E(u,v)\in E,则 f(v,u)cf(v,u)=f(u,v)f^{\prime}(v,u)\leq c_{f}(v,u)=f(u,v),则有

(ff)(u,v)=f(u,v)+f(u,v)f(v,u)f(u,v)+f(u,v)f(u,v)=f(u,v)0(ff)(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)\begin{aligned} (f\uparrow f^{\prime})(u,v)&=f(u,v)+f^{\prime}(u,v)-f^{\prime}(v,u)\\ &\geq f(u,v)+f^{\prime}(u,v)-f(u,v)\\ &=f^{\prime}(u,v)\geq 0 \end{aligned}\\ \, \\ \begin{aligned} (f\uparrow f^{\prime})(u,v)&=f(u,v)+f^{\prime}(u,v)-f^{\prime}(v,u)\\ &\leq f(u,v)+f^{\prime}(u,v)\\ &\leq f(u,v)+c_{f}(u,v)\\ &=f(u,v)+c(u,v)-f(u,v)\\ &=c(u,v) \end{aligned}

对于流量守恒,因为 ffff^{\prime} 都满足流量守恒,对于任意的结点 xV{s,t}x\in V- \{s,t\},有

vV(ff)(x,v)=vV(f(x,v)+f(x,v)f(v,x))=vVf(x,v)+vVf(x,v)vVf(v,x)=vVf(v,x)+vVf(v,x)vVf(x,v)=vV(f(v,x)+f(v,x)f(x,v))=vV(ff)(v,x)\begin{aligned} \sum_{v\in V}(f\uparrow f^{\prime})(x,v)&=\sum_{v\in V}\Big( f(x,v) + f^{\prime}(x,v) - f^{\prime}(v,x) \Big)\\ &=\sum_{v\in V}f(x,v) + \sum_{v\in V} f^{\prime}(x,v) - \sum_{v\in V} f^{\prime}(v,x) \\ &=\sum_{v\in V}f(v,x) + \sum_{v\in V} f^{\prime}(v,x) - \sum_{v\in V} f^{\prime}(x,v) \\ &=\sum_{v\in V}\Big( f(v,x) + f^{\prime}(v,x) - f^{\prime}(x,v) \Big)\\ &=\sum_{v\in V}(f\uparrow f^{\prime})(v,x) \end{aligned}

然后,我们来计算可行流 fff\uparrow f^{\prime} 的值。定义 V1={v(s,v)E},V2={v(v,s)E}V_1=\{v|(s,v)\in E\},\,V_2=\{v|(v,s)\in E\},那么显然有 V1V2V,V1V2=V_1 \cup V_2 \subseteq V,\, V_1 \cap V_2=\varnothing,则有

ff=vV(ff)(s,v)vV(ff)(v,s)=vV1(ff)(s,v)vV2(ff)(v,s)|f\uparrow f ^{\prime}|=\sum_{v\in V}(f\uparrow f ^{\prime})(s,v)-\sum_{v\in V}(f\uparrow f ^{\prime})(v,s)=\sum_{v\in V_1}(f\uparrow f ^{\prime})(s,v)-\sum_{v\in V_2}(f\uparrow f ^{\prime})(v,s)

代入 fff\uparrow f^{\prime} 的定义,可以得到

ff=vV1(f(s,v)+f(s,v)f(v,s))vV2(f(v,s)+f(v,s)f(s,v))=vV1f(s,v)+vV1f(s,v)vV1f(v,s)vV2f(v,s)vV2f(v,s)+vV2f(s,v)=vV1f(s,v)vV2f(v,s)+(vV1f(s,v)+vV2f(s,v))(vV1f(v,s)+vV2f(v,s))=vV1f(s,v)vV2f(v,s)+vV1V2f(s,v)vV1V2f(v,s)=vVf(s,v)vVf(v,s)+vVf(s,v)vVf(v,s)=f+f\begin{aligned} |f\uparrow f ^{\prime}|&=\sum_{v\in V_1}\Big( f(s,v) + f^{\prime}(s,v) - f^{\prime}(v,s) \Big)-\sum_{v\in V_2}\Big( f(v,s) + f^{\prime}(v,s) - f^{\prime}(s,v) \Big)\\ &=\sum_{v\in V_1} f(s,v) + \sum_{v\in V_1} f^{\prime}(s,v) - \sum_{v\in V_1} f^{\prime}(v,s) -\sum_{v\in V_2} f(v,s) - \sum_{v\in V_2} f^{\prime}(v,s) +\sum_{v\in V_2} f^{\prime}(s,v) \\ &=\sum_{v\in V_1} f(s,v) -\sum_{v\in V_2} f(v,s)+\left(\sum_{v\in V_1} f^{\prime}(s,v)+\sum_{v\in V_2} f^{\prime}(s,v)\right) \\&\quad - \left( \sum_{v\in V_1} f^{\prime}(v,s)+ \sum_{v\in V_2} f^{\prime}(v,s) \right) \\ &= \sum_{v\in V_1} f(s,v) -\sum_{v\in V_2} f(v,s)+\sum_{v\in V_1 \cup V_2} f^{\prime}(s,v) - \sum_{v\in V_1\cup V_2} f^{\prime}(v,s)\\ &= \sum_{v\in V} f(s,v) -\sum_{v\in V} f(v,s)+\sum_{v\in V} f^{\prime}(s,v) - \sum_{v\in V} f^{\prime}(v,s)=|f|+|f^{\prime}| \end{aligned}

注意到,最后将求和项的求和范围都扩展到 VV,这是因为其他项的值均为 00.(边不属于 EEEfE_f

增广路径

给定流网络 G=(V,E)G=(V,E) 和可行流 ff,在残留网络 GfG_f 中,从源点 ss 出发,沿着容量 大于 00 的边,如果能够走到汇点 tt,那么这条路径 pp 就称为增广路径。增广路径 pp残留容量 定义为 pp 上能够为每条边增加的流量的最大值,表达式为

cf(p)=min{cf(u,v)(u,v)p}c_f(p)=\min \{c_f(u,v)|(u,v)\in p\}

对于 GfG_f 中的增广路径 pp,定义流 fpf_p 表示一个对流 ff 的可行增量,使其更接近最大流

fp(u,v)=cf(p)(u,v)pf_p(u,v) = c_f(p) \qquad (u,v)\in p

其他情况下 fp(u,v)=0f_p(u,v)=0,显然,fpf_p 是残留网络 GfG_f 的一个可行流,且 fp=cf(p)>0|f_p|=c_f(p)>0.

流网络 G=(V,E)G=(V,E) 中的一个割 (S,T)(S,T) 将结点集 VV 划分为 SST=VST=V-S 两个集合,使得 sS,tTs\in S,\, t\in T,则显然有 ST=V,ST=S\cup T = V,\, S\cap T=\varnothing(S,T)(S,T) 的容量 定义为

c(S,T)=uSvTc(u,v)c(S,T)=\sum_{u\in S}\sum_{v\in T}c(u,v)

(S,T)(S,T) 的流量 定义为

f(S,T)=uSvTf(u,v)uSvTf(v,u)f(S,T)=\sum_{u\in S}\sum_{v\in T}f(u,v) - \sum_{u\in S}\sum_{v\in T}f(v,u)

最小割 问题指给定一个流网络 GG,一个源点 ss,一个汇点 tt,找到值 最小 的一个割。

流与割的关系

给定一个流网络 G=(V,E)G=(V,E),一个源点 ss,一个汇点 tt;首先我们需要证明,对于流网络 GG 中的一个可行流 ff,对于流网络 GG 的任意的割 (S,T)(S,T),都有 f(S,T)=ff(S,T)=|f|.

根据割的流量的定义式,对于互斥的任意结点集 X,Y,ZX,Y,Z,显然有 f(X,Y)=f(Y,X),f(X,X)=0f(X,Y)=-f(Y,X),\,f(X,X)=0

f(Z,XY)=uZvXYf(u,v)uZvXYf(v,u)=uZ(vXf(u,v)+vYf(u,v))uZ(vXf(v,u)+vYf(v,u))=uZvXf(u,v)uZvXf(v,u)+uZvYf(u,v)uZvYf(v,u)=f(Z,X)+f(Z,Y)\begin{aligned} f(Z,X\cup Y)&= \sum_{u\in Z}\sum_{v\in X\cup Y}f(u,v) - \sum_{u\in Z}\sum_{v\in X\cup Y}f(v,u)\\ &= \sum_{u\in Z}\left(\sum_{v\in X}f(u,v) + \sum_{v\in Y}f(u,v)\right) - \sum_{u\in Z}\left(\sum_{v\in X}f(v,u) + \sum_{v\in Y}f(v,u)\right)\\ &=\sum_{u\in Z}\sum_{v\in X}f(u,v) - \sum_{u\in Z}\sum_{v\in X}f(v,u) + \sum_{u\in Z}\sum_{v\in Y}f(u,v) - \sum_{u\in Z}\sum_{v\in Y}f(v,u)\\ &= f(Z,X)+f(Z,Y) \end{aligned}

由于 ST=V,ST=S\cup T = V,\, S\cap T=\varnothing,则有

f(S,V)=f(S,S)+f(S,T)f(S,T)=f(S,V)f(S,S)=f(S,V)=f({s},V)+f(S{s},V)\begin{aligned} f(S,V) &= f(S,S)+f(S,T)\\ f(S,T) &= f(S,V) - f(S,S)\\ &=f(S,V)\\ &=f(\{s\},V)+f(S-\{s\},V) \end{aligned}

由于 SS 中首先没有汇点 tt,则 S{s}S-\{s\} 不包含源点和汇点,流量守恒,则有

f(S{s},V)=uS{s}vVf(u,v)uS{s}vVf(v,u)=uS{s}(vVf(u,v)vVf(v,u))=0\begin{aligned} f(S-\{s\},V)&=\sum_{u\in S-\{s\}}\sum_{v\in V} f(u,v) - \sum_{u\in S-\{s\}}\sum_{v\in V} f(v,u)\\ &=\sum_{u\in S-\{s\}}\left(\sum_{v\in V}f(u,v)-\sum_{v\in V} f(v,u)\right)=0 \end{aligned}

所以有 f(S,T)=f({s},V)=vVf(s,v)vVf(v,s)=ff(S,T)=f(\{s\},V)=\sum_{v\in V}f(s,v)-\sum_{v\in V}f(v,s)=|f|.

根据上述结论,我们可以容易地证明流网络 GG 中任意可行流 ff 的值 f=f(S,T)|f|=f(S,T) 不超过 GG 中任意割 (S,T)(S,T) 的容量 c(S,T)c(S,T).

f(S,T)=uSvTf(u,v)uSvTf(v,u)uSvTf(u,v)uSvTc(u,v)=c(S,T)f(S,T)=\sum_{u\in S}\sum_{v\in T}f(u,v) - \sum_{u\in S}\sum_{v\in T}f(v,u)\leq \sum_{u\in S}\sum_{v\in T}f(u,v) \leq \sum_{u\in S}\sum_{v\in T}c(u,v) = c(S,T)

最大流最小割定理

ff 是流网络 G=(V,E)G=(V,E) 的一个可行流,流网络 GG 的源点为 ss,汇点为 tt,则下列条件是等价的

  1. 可行流 ff 是流网络 GG 的一个最大流
  2. 可行流 ff 的残留网络 GfG_f 不存在增广路径
  3. 存在某个割 (S,T)(S,T) 使得 f=c(S,T)|f|=c(S,T)

首先证明 121\Rightarrow 2,用反证法,假设 ffGG 的一个最大流,残留网络 GfG_f 包含一条增广路径 pp,显然有 fp>0|f_p|>0,则 f+fp=f+fp>f|f+f_p|=|f|+|f_p|>|f|,这与 ff 是最大流矛盾。

证明 232\Rightarrow 3,定义集合 SS 表示在残留网络 GfG_f 中,从源点 ss 出发,沿着容量大于 00 的边走,所有能走到的结点的集合;集合 T=VST=V-S,显然 sSs\in S,由于 GfG_f 不存在增广路径,tSt\notin S,则 tTt\in T,所以 (S,T)(S,T) 是流网络 GG 的一个割。

考虑一对结点 uS,vTu\in S,\, v\in T;如果 (u,v)E(u,v)\in E,则有 f(u,v)=c(u,v)f(u,v)=c(u,v);因为如果 f(u,v)<c(u,v)f(u,v)<c(u,v),在 GfG_f 中,cf(u,v)=c(u,v)f(u,v)>0c_f(u,v)=c(u,v)-f(u,v)>0,则结点 vv 应当属于 SS,矛盾。

如果 (v,u)E(v,u)\in E,则有 f(v,u)=0f(v,u)=0;若 f(v,u)>0f(v,u)>0,在 GfG_f 中,cf(u,v)=f(v,u)>0c_f(u,v)=f(v,u)>0,则 vv 应属于 SS,矛盾。

对于 (u,v)E(u,v)\notin E 并且 (v,u)E(v,u)\notin E 的情况,显然有 f(u,v)=f(v,u)=0f(u,v)=f(v,u)=0,则有

f=f(S,T)=uSvTf(u,v)uSvTf(v,u)=uSvTc(u,v)=c(S,T)|f|=f(S,T)=\sum_{u\in S}\sum_{v\in T}f(u,v) - \sum_{u\in S}\sum_{v\in T}f(v,u)=\sum_{u\in S}\sum_{v\in T}c(u,v)=c(S,T)

最后证明 313\Rightarrow 1,对于所有可行流 ff,对于所有的割 (S,T)(S,T),都有 fc(S,T)|f|\leq c(S,T),因此,条件 f=c(S,T)|f|=c(S,T) 蕴含了 ff 是一个最大流。(同时也说明了流网络的最大流的流量等于最小割的容量)