网络流#
IMPORTANT本文主要讨论有源汇的网络流.
见到网上关于网络流的资料的数学规定较为杂乱,本文负责整理和浓缩.
源汇点#
在有向图 G=(V,E) 中,钦定 s∈V 和 t∈V 分别作为源点和汇点,s=t.
对于 V 的划分 {S,T},若 s∈S 且 t∈T,则称 {S,T} 为 G 的 s-t 割.
函数 c:V2→R 满足
- ∀(u,v)∈V2,c(u,v)≥0,当且仅当 (u,v)∈/E 时,等号成立.
此时称 c 为容量.
对于函数 f:V2→R,以下是一些记号:
- u 的净流量 f(u)=∑v∈V∖{u}f(u,v).
- U 的净流量 f(U)=∑u∈U∑v∈V∖Uf(u,v).
若 f 满足
- (流动无损耗) ∀(u,v)∈V2,f(u,v)+f(v,u)=0.
- (流动有限制) ∀(u,v)∈V2,f(u,v)≤c(x,y).
- (流不可存储) ∀u∈V∖{s,t},f(u)=0.
- (源汇点) f(s)=−f(t)=∣f∣>0.
则称 f 为流,∣f∣ 为总流量.
TIPf(u,v) 表示 v 从 u 接受的流.容量非负,但流可负.
容易看出,点集的总净流量等于各点净流量之和.
u∈U∑f(u)=u∈U∑w∈V∖{u}∑f(u,w)=u∈U∑v∈V∖U∑f(u,v)+u∈U∑v∈U∖{u}∑f(u,v)=u∈U∑v∈V∖U∑f(u,v)=f(U)
对于 s-t 割,由于流不可存储,可见
f(S)=u∈S∑f(u)=f(s)=∣f∣
对于 s-t 割,记
- 容量 c(S,T)=∑u∈S∑v∈Tc(u,v).
- 流量 f(S,T)=∑u∈S∑v∈Tf(u,v).
显然 f(S,T)=f(S)=∣f∣,容易得到且更重要的是:任给一个 s-t 割,都有
∣f∣≤c(S,T)IMPORTANT这说明:受容量函数影响,总流量存在上界.很显然,由于 s-t 割法有限,右式存在最小值,即最小割的容量.问题来了:等号能否成立?换句话说,最大流的流量是否等于最小割的容量?
由于所有流的流量都不会超过所有割的容量,我们只需寻找一个流量能够等于一个割的容量(不必证明是最小割)的流.
TIP这相当于给你两个实数闭区间 A 和 B.已知 A≤B,那么只需要 ∃a∈A,满足 a∈B,我们便能得知 maxA=minB,因为 ∀a∈A,∄b∈B,b<a.
残量网络#
称函数 cf=c−f 为剩余容量,记 cf(S,T)=∑u∈S∑v∈Tcf(u,v).
当 cf(u,v)=0 时,我们称 (u,v) 满流;当 f(u,v)=0 时,我们称 (u,v) 空流.
TIP∀(u,v)∈V2,cf(u,v)=c(u,v)−f(u,v)≥0,即剩余容量非负.
我们根据原图 G 构建新图 Gf=(V,Ef),其中 Ef={(u,v)∣cf(u,v)>0},称 Gf 为残量网络.
Ford–Fulkerson 增广#
在 Gf 中,我们称起点为 s、终点为 t 的迹 P⊂Ef,为 Gf 的增广路.
IMPORTANT
- 途径 (walk):途径是边列 ((v0,v1),(v1,v2),⋯),点和边都有可能相同.
- 迹 (trail):迹是边互不相同的途径.回路 (circuit) 是起点和终点相同的迹.
- 路径 (path):路径是点互不相同的迹.圈 (cycle) 是除了起点和终点以外,点互不相同的路径.自环 (loop) 是两个端点相同的边.
取当前的残量网络 Gf 中的一条增广路 P,构建新流 f′:V2→R,满足
f′(u,v)={f(u,v),f(u,v)+min(u,v)∈Pcf(u,v),(u,v)∈/P(u,v)∈P从而构建出新的残量网络 Gf′,这个过程称为增广.
- 我们发现,由于 P⊂Ef,总有 f′(u,v)>f(u,v).
- 记 C=min(u,v)∈Pcf(u,v),我们发现 cf′(u,v)=cf(u,v)−C,cf′(v,u)=cf(v,u)+C.
最大流最小割定理#
我们将证明:一个残量网络不存在增广路(无法增广),当且仅当存在 s-t 割,使得 cf(S,T)=0.
充分性显然,下面证明必要性.
考虑其逆否命题:若任取 s-t 割,都有 cf(S,T)>0,则存在增广路.
我们进行构造性证明:设初始 s-t 割 {{s},V∖{s}}.对于每一步的 s-t 割 {S,T},由于 cf 非负,我们总能取满足 cf(u,v)>0 的 (u,v)∈S×T⊂Ef.将其加入迹 P,更新 s-t 割为 {S∪{v},T∖{v}}.由于 V 是有限集,构造将终止,显然最终的迹 P 为增广路.
重点来了,cf(S,T)=0 意味着 ∣f∣=f(S,T)=c(S,T),总流量等于一个 s-t 割的容量.我们不仅找到了最大流,而且证明了最大流最小割定理:最大流的流量等于最小割的容量.
NOTE我们只要让一个残量网络无法增广,就能得到最大流.那是不是不断增广残量网络,就能找到最大流?
如果流量和容量都是整数,由于每次增广都至少让总流量 +1,那么最多需要 ∣f∣ 次增广,每次增广都使用时间复杂度为 O(∣E∣) 的朴素方法寻找增广路,因此总复杂度为 O(∣E∣∣f∣),f 为最大流.
但如果不是整数,且使用朴素的方法进行增广,那么无法保证每次增广给总流量带来的增量存在最小值,无法保证增广能够终止.