网络流——概念篇
网络
网络表示一个有向图(可能有环), G = ( V , E ) G=(V,E) G=(V,E)
每条边 ( u , v ) ∈ E (u,v)\in E (u,v)∈E都有一个权值 c ( u , v ) c(u,v) c(u,v),称之为容量,对于$(u,v)\notin E ,均有 ,均有 ,均有c(u,v)=0$
其中有两个点:
s ∈ V s\in V s∈V源点(没有入度)
t ∈ V t\in V t∈V汇点(没有出度)
流
设 f ( u , v ) f(u,v) f(u,v)定义在二元组 ( u ∈ V , v ∈ V ) (u\in V,v\in V) (u∈V,v∈V)上的实数函数且满足
- 容量限制:对于每条边,流经该边的流量不得超过该边的容量,即, f ( u , v ) ≤ c ( u , v ) f(u,v)\le c(u,v) f(u,v)≤c(u,v)
- 斜对称性:每条边的流量与其相反边的流量之和为 0,即 f ( u , v ) = − f ( v , u ) f(u,v)=-f(v,u) f(u,v)=−f(v,u)
- 流守恒性:从源点流出的流量等于汇点流入的流量,即 $\forall x\in V-{s,t}, {\textstyle \sum_{(u,x)\in E}}f(u,x)={\textstyle \sum_{x,v\in E}}f(x,v) $
那么 f f f称为网络 G G G的流函数。对于 ( u , v ) ∈ E (u,v)\in E (u,v)∈E, f ( u , v ) f(u,v) f(u,v)称为边的流量, c ( u , v ) − f ( u , v ) c(u,v)-f(u,v) c(u,v)−f(u,v)称为边的剩余容量。整个网络的流量为 , ∑ ( s , v ) ∈ E f ( s , v ) \sum_{(s,v)\in E}f(s,v) ∑(s,v)∈Ef(s,v)即从源点发出的所有流量之和。
一般而言也可以把网络流理解为整个图的流量。而这个流量必满足上述三个性质。
注:流函数的完整定义为:
f ( u , v ) = { f ( u , v ) , ( u , v ) ∈ E − f ( v , u ) , ( v , u ) ∈ E 0 , ( u , v ) ∉ E , ( v , u ) ∉ E f(u,v)=\left\{\begin{aligned} &f(u,v),&(u,v)\in E\\ &-f(v,u),&(v,u)\in E\\ &0,&(u,v)\notin E,(v,u)\notin E \end{aligned}\right. f(u,v)=⎩ ⎨ ⎧f(u,v),−f(v,u),0,(u,v)∈E(v,u)∈E(u,v)∈/E,(v,u)∈/E
网络流的常见问题
网络流问题中常见的有以下三种:最大流,最小割,费用流。
最大流
我们有一张图,要求从源点流向汇点的最大流量(可以有很多条路到达汇点),就是我们的最大流问题。
最小费用最大流
最小费用最大流问题是这样的:每条边都有一个费用,代表单位流量流过这条边的开销。我们要在求出最大流的同时,要求花费的费用最小。
最小割
割其实就是删边的意思,当然最小割就是割掉 X X X条边来让 S S S跟 T T T不互通。我们要求 X X X条边加起来的流量总和最小。这就是最小割问题。
残量网络
首先我们介绍一下一条边的剩余容量 c f ( u , v ) cf(u,v) cf(u,v),它表示的是这条边的容量与流量之差,即 c f ( u , v ) = c ( u , v ) − f ( u , v ) cf(u,v)=c(u,v)-f(u,v) cf(u,v)=c(u,v)−f(u,v)。
对于流函数 f f f, G f G_f Gf残量网络是网络 G G G中所有结点和剩余容量大于 0 的边构成的子图。形式化的定义,即 G f = ( V f = V , E f = { ( u , v ) ∈ E , c f ( u , v ) > 0 } ) G_f=(V_f=V,E_f=\left\{(u,v)\in E,c_f(u,v)>0\right\}) Gf=(Vf=V,Ef={(u,v)∈E,cf(u,v)>0})。
注意,剩余容量大于 0 的边可能不在原图 G G G中(根据容量、剩余容量的定义以及流函数的斜对称性得到)。可以理解为,残量网络中包括了那些还剩了流量空间的边构成的图,也包括虚边(即反向边)。
增广路
在原图 G G G中若一条从源点到汇点的路径上所有边的剩余容量都大于0这条路被称为增广路。
或者说,在残量网络 G f G_f Gf中,一条从源点到汇点的路径被称为增广路。
参考:OI WIKI