网络流之最大流
流网络
流网络 G=(V,E) 是一个有向图。对于图中的每条边 (u,v)∈E 有一个非负的容量(值)c(u,v)≥0。并且,若边集合 E 中有边 (u,v),则流网络中一定不存在其反向边 (v,u)。此外,流网络中可议有环,但不允许有自环。特殊的,若图中有反向边,则可以化为如下形式(1 号边拆为 2,3 号边)。
在流网络中,我们分辨出两个特殊的节点:源节点 s 和 汇点 t。对于 ∀v∈V,都存在从 s 到 v,再到 t 的路径(流网络是连通的)。并且,在流网络中,除了源节点外,每个节点都至少有一条入边。
可行流
对于一个流网络 G=(V,E),其容量函数为 c。则 G 的一个可行流(实值函数 f)需要满足以下两个条件。
1.容量限制。∀u,v∈V,有 0≤f(u,v)≤c(u,v)。
2.流量守恒。∀u,v∈V−{s,t},有 ∑v∈Vf(v,u)=∑v∈Vf(u,v)。
对于一个可行流 f,其流量的定义为 |f|=∑v∈Vf(s,v)−∑v∈Vf(v,s)。通常,第二项为 0(残余网络不是)。此外,由定义易得一个流网络可能有无限个可行流。其中,流量最大的一个可行流被称为最大可行流(最大流)。
残余网络
对于一个流网络 G 和该流网络的一个可行流 f,有与该可行流相对应的残余网络 Gf。
该残存网络的点集与原流网络的点集相同。而构成该残存网络的边不仅有原流网络中的边,还有原流网络中边的反向边。对于残余网络 Gf,其残存容量 cf(u,v) 的定义为:
cf(u,v)={c(u,v)−f(u.v)(u,v)∈Ef(v,u)(v,u)∈E0else
例如,对于如下流网络和其的一个可行流:
它的残余网络为:
引理 1:
设 f′ 为 Gf 的一个可行流,则 f↑f′ 也是 G 的一个可行流,且该可行流的流量 |f↑f′|=|f|+|f′|。其中 f↑f′ 是流 f′ 对流 f 的递增,(f↑f′)(u,v)=f(u,v)+f′(u,v)−f′(v,u) ((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′遵守流量守恒性质,因此
∑v∈V(f↑f′)(u,v)=∑v∈V(f(u,v)+f′(u,v)−f′(v,u))
=∑v∈Vf(u,v)+∑v∈Vf′(u,v)−∑v∈Vf′(v,u)
=∑v∈Vf(v,u)+∑v∈Vf′(v,u)−∑v∈Vf′(u,v)
=∑v∈V(f(v,u)+f′(v,u)−f′(u,v))
=∑v∈V(f↑f′)(v,u)
其增加流后的流量证明略。
增广路径
对于一个流网络 G 和其的一个可行流 f,增广路径 p 是残余网络 Gf 中一条从源点到汇点的简单路径。
对于一条增广路径 p,能为每条边加上的最大流量为路径 p 的残余容量。其表达式为 cf(p)=min{cf(u,v)[(u,v)∈p]}。
流网络的切割(割)
附:网络流之最小割 常见模型。
流网络 G=(V,E) 的一个割 (S,T) 把点集 V 分为了 S 和 T=V−S 两个集合,使得 s∈S,t∈T。定义某个割 (S,T) 的流量(净流量)为 f(S,T)=∑u∈S∑v∈Tf(u,v)−∑u∈S∑v∈Tf(v,u)。定义割的容量 c(S,T)=∑u∈S∑v∈Tc(u,v)。需要注意的是,割的容量只算 S 到 T 的部分,而割的流量则还要算 T 到 S 的部分(其定义的不对称性)。此外,最小割指最小切割容量。
引理 2:
设 f 是流网络 G 的一个可行流,(S,T) 是 G 的一个(任意)切割,则 f(S,T)=|f|。
证明:
为方便证明,我们定义如下函数:X,Y 是两个点集且并集为空,表达式f(X,Y)=∑u∈X∑v∈Yf(u,v)−∑u∈X∑v∈Yf(v,u)。那么我们有:
1.f(X,Y)=−f(Y,X)
2.f(X,X)=f(Y,Y)=0
3.若还有一个点集 Z,f(Z,X∪Y)=f(Z,X)+f(Z,Y)
因此,我们有
f(S,T)+f(S,S)=f(S,S∪T)=f(S,V)
f(S,T)=f(S,V)−f(S,S)
f(S,T)=f(S,V)
f(S,T)=f({s},V)+f(S−{s},V)
因为s,t∉S−{s},故这些节点满足流量守恒,故后面一项为 0。因此,有
f(S,T)=f({s},V)=|f|(|f| 的定义式)
证毕。
引理 3:
流网络 G 中最大流的流量不超过 G 的任意割的容量。
证明:
|f|=f(S,T)=∑u∈S∑v∈Tf(u,v)−∑u∈S∑v∈Tf(v,u)
≤∑u∈S∑v∈Tf(u,v)
≤∑u∈S∑v∈Tc(u,v)
=c(S,T)(c(S,T) 的定义式)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?