流网络:由一些点和有向边组成的可以有环的图,记作 G = ( V , E ) G=(\text V,\text E) G=(V,E),其中 V \text V V 是点集, E \text E E 是边集。定义 n = ∣ V ∣ , m = ∣ E ∣ n=|\text V|,m=|\text E| n=∣V∣,m=∣E∣,在本篇文章中使用。
源点:在一个流网络中,入度为 0 0 0 且能流出的流量为 ∞ \infty ∞ 的点。一般用斜体大写字母 S S S 表示。
汇点:在一个流网络中,出度为 0 0 0 且能流入的流量为 ∞ \infty ∞ 的点。一般用斜体大写字母 T T T 表示。
流网络里的每一条边都有一个属性,称为该边的 容量(该边每秒最多能流过的单位流量),一般用 c ( u , v ) c(u, v) c(u,v) 表示。 { u ∈ V , v ∈ V , ( u , v ) ∈ E } \{u\in \text V,v\in \text V,(u,v)\in \text E\} {u∈V,v∈V,(u,v)∈E}
注意:
下图为一个流网络,存在源点 S S S 和汇点 T T T,每条边上都有对应的容量。
可行流: 对于任意满足以下两个条件的流,被称为可行流,用字母 f f f 表示。 ∣ f ∣ |f| ∣f∣ 表示该可行流的流量。
0 < f ( u , v ) ≤ c ( u , v ) { u ∈ V , v ∈ V , ( u , v ) ∈ E } 0<f(u,v)\leq c(u,v)\{u\in \text V,v\in \text V,(u,v)\in \text E\} 0<f(u,v)≤c(u,v){u∈V,v∈V,(u,v)∈E}
? x ∈ V / { S , T } , ∑ ( u , x ) ∈ E f ( u , x ) = ∑ ( x , v ) ∈ E f ( x , v ) \forall x\in \text V/\{S,T\},\sum_{(u,x)\in \text E}f(u,x)=\sum_{(x,v)\in \text E}f(x,v) ?x∈V/{S,T},(u,x)∈E∑?f(u,x)=(x,v)∈E∑?f(x,v)
最大流: 流网络中流量值最大的一个 可行流 被称为该流网络的 最大可行流,简称为最大流。
这张图显示的是原图的最大流,值为
9
9
9。
残量网络:对于任意一个流网络 G G G 中的任意一个可行流 f f f,都能对应一个残量网络,记作 G f G_f Gf?。
G f G_f Gf? 的构造: V f = V , E f = E ∪ { ( v , u ) ∣ ? ( u , v ) ∈ E } \text V_f=\text V,\text E_f=\text E\cup \{(v,u)|\forall (u,v)\in \text E\} Vf?=V,Ef?=E∪{(v,u)∣?(u,v)∈E}
{ c ′ ( u , v ) = c ( u , v ) ? f ( u , v ) [ ( u , v ) ∈ E ] c ′ ( v , u ) = f ( u , v ) [ ( v , u ) ∈ E ] \left\{\begin{matrix} c'(u,v)=c(u,v)-f(u,v)[(u,v)\in \text E] \\ c'(v,u)=f(u,v)[(v,u)\in \text E] \end{matrix}\right. {c′(u,v)=c(u,v)?f(u,v)[(u,v)∈E]c′(v,u)=f(u,v)[(v,u)∈E]?
上图最大流对应的残量网络如下:
原网络
G
G
G 的可行流
f
f
f 与残量网络
G
f
G_f
Gf? 的可行流
f
′
f'
f′ 的关系:
证明:
首先定义一下两个可行流的相加。如果是两个同向边相加,则将容量累加,如果是反向边,就把残量网络里的流量在原网络里减去。
然后看可行流需要满足的两个条件。
首先看是否满足容量限制。对于同向边,由于 0 ≤ f ′ ( u , v ) ≤ c ′ ( u , v ) = c ( u , v ) ? f ( u , v ) 0\leq f'(u,v)\leq c'(u,v)=c(u,v)-f(u,v) 0≤f′(u,v)≤c′(u,v)=c(u,v)?f(u,v),因此同向边满足 0 ≤ f ( u , v ) + f ′ ( u , v ) ≤ c ( u , v ) 0\leq f(u,v)+f'(u,v)\leq c(u,v) 0≤f(u,v)+f′(u,v)≤c(u,v)。
对于反向边,由于 0 ≤ f ′ ( u , v ) ≤ c ′ ( u , v ) = f ( v , u ) ≤ c ( v , u ) 0\leq f'(u,v)\leq c'(u,v)=f(v,u)\leq c(v,u) 0≤f′(u,v)≤c′(u,v)=f(v,u)≤c(v,u),因此反向边满足 0 ≤ f ( v , u ) ? f ′ ( u , v ) ≤ c ( v , u ) 0\leq f(v,u)-f'(u,v)\leq c(v,u) 0≤f(v,u)?f′(u,v)≤c(v,u)。
综上可知,两个可行流相加是满足容量限制的。
对于是否满足流量守恒,这不需要证明,由于原网络满足流量守恒,残量网络也满足流量守恒,那么对于同向边,流入的累加流入的,流出的累加流出的,满足流量守恒,而反向边只不过是相互抵消了一部分的流量,同样满足流量守恒。
由此得出,原网络的任意一个可行流加上残量网络的任意一个可行流所得到的流都是原网络的一个可行流。
对于计算得到的新流的流量值,因为流量值是可行流净往外流出的流量,因此新流的净往外流出的流量 = 原网络的可行流净往外流出的流量 + 残量网络的可行流净往外流出的流量
作用:
通过以上特性,任何一个在残量网络里面发现的流量 >0 的可行流,都能用来增加原网络的可行流。
同时得到一个推论,如果残量网络中存在任何一个流量 >0 的可行流,那么原网络里的可行流就一定不是最大的可行流。
对于最大流来说反过来也是正确的,即如果残量网络中不存在任何一个流量 >0 的可行流,那么原网络里的可行流就一定是最大的可行流。这个反命题可以通过下文的 最大流最小割定理 得出。
增广路径: 在残量网络中从源点出发,沿着容量 >0 的边,存在一条路径能走到汇点,这条路径被称为 增广路径。
注意: 增广路径一般指没有环的简单路径。
割: 对于流网络 G = ( V , E ) G=(V,E) G=(V,E),将点集 V \text V V 分成两个子集 S , T \text S,\text T S,T(子集中的节点不需要连通),保证 S ∪ T = V , S ∩ T = ? \text S\cup \text T=\text V,\text S\cap \text T=\varnothing S∪T=V,S∩T=?,且 S ∈ S , T ∈ T S \in \text S,T \in \text T S∈S,T∈T,像这样的一种将点集划分的结果,就称为割。
割的容量: 所有从 S \text S S 指向 T \text T T 的边的容量之和,即:
c ( S , T ) = ∑ u ∈ S ∑ v ∈ T c ( u , v ) c(\text S,\text T)=\sum_{u\in \text S}\sum_{v \in \text T}c(u,v) c(S,T)=u∈S∑?v∈T∑?c(u,v)
最小割:从流网络中割的所有划分方案中找出割的容量的最小值,被称为该流网络的最小割,又叫最小割的容量。 n n n 个点的流网络中存在 2 n ? 2 2^{n-2} 2n?2 种割的划分方案。
割的流量:流网络中所有从 S \text S S 流到 T \text T T 的流量,减去所有从 T \text T T 流到 S \text S S 的流量。即:
f ( S , T ) = ∑ u ∈ S ∑ v ∈ T f ( u , v ) ? ∑ u ∈ T ∑ v ∈ S f ( u , v ) f(\text S,\text T)=\sum_{u\in \text S}\sum_{v \in \text T}f(u,v)-\sum_{u\in \text T}\sum_{v \in \text S}f(u,v) f(S,T)=u∈S∑?v∈T∑?f(u,v)?u∈T∑?v∈S∑?f(u,v)
∴ f ( S , T ) ≤ ∑ u ∈ S ∑ v ∈ T f ( u , v ) ≤ ∑ u ∈ S ∑ v ∈ T c ( u , v ) = c ( S , T ) \therefore f(\text S,\text T)\le \sum_{u\in \text S}\sum_{v \in \text T}f(u,v) \le \sum_{u\in \text S}\sum_{v \in \text T}c(u,v)=c(\text S,\text T) ∴f(S,T)≤u∈S∑?v∈T∑?f(u,v)≤u∈S∑?v∈T∑?c(u,v)=c(S,T)
命题得证。
性质 2 2 2:对于 ? [ S , T ] , ? f \forall[\text S,\text T],\forall f ?[S,T],?f,都有 f ( S , T ) = ∣ f ∣ f(\text S,\text T)=|f| f(S,T)=∣f∣。
证明
2
2
2:
∵
f
(
S
,
V
)
=
f
(
S
,
S
)
+
f
(
S
,
T
)
\because f(\text S,\text V)=f(\text S,\text S)+f(\text S,\text T)
∵f(S,V)=f(S,S)+f(S,T)
而
f
(
S
,
S
)
=
0
f(\text S,\text S)=0
f(S,S)=0
∴
f
(
S
,
T
)
=
f
(
S
,
V
)
=
f
(
{
S
}
,
V
)
+
f
(
S
?
{
S
}
,
V
)
\therefore f(\text S,\text T)=f(\text S,\text V)=f(\{S\},\text V)+f(\text S?\{S\},\text V)
∴f(S,T)=f(S,V)=f({S},V)+f(S?{S},V)
而 f ( S ? { S } , V ) f(\text S?\{S\},\text V) f(S?{S},V) 中 S ? { S } \text S?\{S\} S?{S} 不包含 S , T S,T S,T,由于 f ( S ? { S } , V ) f(\text S?\{S\},\text V) f(S?{S},V) = 出去的流量 - 回来的流量,在不包含源点和汇点的前提下,其他点的流量的流出和流入都是固定的,流出多少就流回来多少,所以 f ( S ? { S } , V ) = 0 f(\text S?\{S\},\text V)=0 f(S?{S},V)=0。因此 f ( S , T ) = f ( { S } , V ) = ∣ f ∣ f(\text S,\text T)=f(\{S\},\text V)=|f| f(S,T)=f({S},V)=∣f∣。
f ( X , Y ) = ? { ∑ u ∈ X ∑ v ∈ Y f ( v , u ) ? ∑ u ∈ X ∑ v ∈ Y f ( u , v ) } f(\text X,\text Y)=-\left\{\sum_{u\in \text X}\sum_{v\in \text Y}f(v,u)-\sum_{u\in \text X}\sum_{v\in \text Y}f(u,v)\right\} f(X,Y)=?{u∈X∑?v∈Y∑?f(v,u)?u∈X∑?v∈Y∑?f(u,v)}
∴ f ( X , Y ) = ? f ( Y , X ) \therefore f(\text X,\text Y)=-f(\text Y,\text X) ∴f(X,Y)=?f(Y,X)
性质 4 4 4: f ( Z , X ∪ Y ) = f ( Z , X ) + f ( Z , Y ) f(\text Z,\text X\cup\text Y)=f(\text Z,\text X)+f(\text Z,\text Y) f(Z,X∪Y)=f(Z,X)+f(Z,Y)
证明 4 4 4:
f ( Z , X ∪ Y ) = { ∑ u ∈ Z ∑ v ∈ X f ( u , v ) + ∑ u ∈ Z ∑ v ∈ Y f ( u , v ) } ? { ∑ u ∈ Z ∑ v ∈ X f ( v , u ) + ∑ u ∈ Z ∑ v ∈ Y f ( v , u ) } f(\text Z,\text X\cup\text Y)=\left\{\sum_{u\in \text Z}\sum_{v\in \text X}f(u,v)+\sum_{u\in \text Z}\sum_{v\in \text Y}f(u,v)\right\}?\left\{\sum_{u\in \text Z}\sum_{v\in \text X}f(v,u)+\sum_{u\in \text Z}\sum_{v\in \text Y}f(v,u)\right\} f(Z,X∪Y)={u∈Z∑?v∈X∑?f(u,v)+u∈Z∑?v∈Y∑?f(u,v)}?{u∈Z∑?v∈X∑?f(v,u)+u∈Z∑?v∈Y∑?f(v,u)}
∴ f ( Z , X ∪ Y ) = f ( Z , X ) + f ( Z , Y ) \therefore f(\text Z,\text X\cup\text Y)=f(\text Z,\text X)+f(\text Z,\text Y) ∴f(Z,X∪Y)=f(Z,X)+f(Z,Y)
f ( X , X ) = ∑ u ∈ X ∑ v ∈ X f ( u , v ) ? ∑ u ∈ X ∑ v ∈ X f ( v , u ) = 0 f(\text X,\text X)=\sum_{u\in \text X}\sum_{v\in \text X}f(u,v)?\sum_{u\in \text X}\sum_{v\in \text X}f(v,u)=0 f(X,X)=u∈X∑?v∈X∑?f(u,v)?u∈X∑?v∈X∑?f(v,u)=0
最大流最小割定理
对于任意一个流网络 G = ( V , E ) G=(V,E) G=(V,E) 都满足:
? \Leftrightarrow ?
? \Leftrightarrow ?
证明:
费用:对于任意一个可行流 f f f,每条边 ( u , v ) (u,v) (u,v) 都有流量 f ( u , v ) f(u,v) f(u,v) 和费用 w ( u , v ) w(u,v) w(u,v),该可行流的费用为 ∑ f ( u , v ) × w ( u , v ) \sum f(u,v)\times w(u,v) ∑f(u,v)×w(u,v)。
最大费用流: 所有最大可行流中费用最大的流称为最大费用最大流。
最小费用流: 所有最大可行流中费用最小的流称为最小费用最大流。
注意: 一张图 G G G 有最大流,那么就一定有最小费用最大流,但是存在一些特殊的图,图中存在一个从源点无法到达的闭环,闭环中的费用是负的,这时最小费用流可能比我们求出来的更小,因此我们求费用流的做法存在局限性,并不一定能求出最小费用最大流。
如何求最小费用最大流:
最小费用最大流是基于 EK 算法来求的,只需要把 EK 算法中找增广路径的 BFS 算法换成找最短路的 SPFA 算法就可以求最小费用最大流了。
之前我们定义残量网络中反向边的流量等于正向边的容量,表示一个退流的概念,因此我们还需要定义一下反向边的费用,我们希望在退流的同时将费用也退掉,因此可以定义反向边的费用等于负的正向边的费用。
注意: 由于 SPFA 算法遇到负权回路会进入死循环,所以我们常规的求最小费用最大流的算法并不能处理有负权回路的网络。如果网络中存在负权回路,就需要用消圈法来做。