更好的阅读体验
通常做题思路:问题转化为流网络,再通过最大流 / 最小割 / 费用流与问题之间的数量关系,求解出原问题。
网络流于其他算法不同,概念定理需要熟记于心,否则后面做题会有很大的障碍。
1. 流网络
一个流网络记作 G = ( V , E ) G=(V,E) G=(V,E),其中 V V V 表示点集, E E E 表示边集。对于 ∀ ( u , v ) ∈ E \forall (u,v)\in E ∀(u,v)∈E,都有一个容量记作 c ( u , v ) c(u,v) c(u,v)。由于是一张流网络,那肯定还应该有汇点与源点,通常记作 s , t s,t s,t。
如图,这就是一张流网络。
2. 可行流
对于每一个流网络,满足以下 2 2 2 个条件为可行流:
-
容量限制
记作: 0 ≤ f ( u , v ) ≤ c ( u , v ) 0\le f(u,v) \le c(u,v) 0≤f(u,v)≤c(u,v),即流经每条边的流量不能超过他的限制。
-
流量守恒
记作: ∑ ( v , x ) ∈ E f ( v , x ) = ∑ ( x , v ) ∈ E f ( x , v ) \sum_{(v,x)\in E}f(v,x)=\sum_{(x,v)\in E}f(x,v) ∑(v,x)∈Ef(v,x)=∑(x,v)∈Ef(x,v),即除了源点与汇点之外,流入点 i i i 的总流量 = = = 流出点 i i i 的总流量。
可行流的流量 ∣ f ∣ |f| ∣f∣,是指从源点流出的总流量。
即: ∣ f ∣ = ∑ ( s , v ) ∈ E f ( s , v ) − ∑ ( v , s ) ∈ E f ( v , s ) |f|=\sum_{(s,v)\in E}f(s,v)-\sum_{(v,s)\in E}f(v,s) ∣f∣=∑(s,v)∈Ef(s,v)−∑(v,s)∈Ef(v,s)
3. 残留网络
一般来说,残留网络记作 G f = ( V , E + ! E ) G_f=(V,E+!E) Gf=(V,E+!E),其中 V , E V,E V,E 是源网络的边集和点集, ! E !E !E 表示 E E E 中的所有反向边。
容量:
c
′
(
u
,
v
)
=
{
c
(
u
,
v
)
−
f
(
u
,
v
)
(
u
,
v
)
∈
E
f
(
u
,
v
)
(
u
,
v
)
∈
!
E
c'(u,v)=\begin{cases} & c(u,v)-f(u,v) & (u,v)\in E \\ & f(u,v) & (u,v) \in !E \end{cases}
c′(u,v)={c(u,v)−f(u,v)f(u,v)(u,v)∈E(u,v)∈!E
定理
f f f 为原网络的可行流, f ′ f' f′ 为残留网络的可行流。
则有: f + f ′ f+f' f+f′ 也是 G G G 的一个可行流且 ∣ f + f ′ ∣ = ∣ f ∣ + ∣ f ′ ∣ |f+f'|=|f|+|f'| ∣f+f′∣=∣f∣+∣f′∣
证明:定义 f n = f + f ′ f_{n}=f+f' fn=f+f′,则 f n ( u , v ) = f ( u , v ) + f ′ ( u , v ) f_n(u,v)=f(u,v)+f'(u,v) fn(u,v)=f(u,v)+f′(u,v)(注意这里只考虑正向边),为了证明也是一个可行流,无非从 2 2 2 方面:容量限制和流量守恒。
容量限制: f ′ ( u , v ) ≤ c ′ ( u , v ) = c ( u , v ) − f ( u , v ) f'(u,v)\le c'(u,v)=c(u,v)-f(u,v) f′(u,v)≤c′(u,v)=c(u,v)−f(u,v),所以 f ( u , v ) + f ′ ( u , v ) ≤ c ( u , v ) f(u,v)+f'(u,v)\le c(u,v) f(u,v)+f′(u,v)≤c(u,v)
流量守恒:因为 f ( u , v ) f(u,v) f(u,v) 满足流量守恒, f ′ ( u , v ) f'(u,v) f′(u,v) 也满足流量守恒,所以 f ( u , v ) + f ′ ( u , v ) f(u,v)+f'(u,v) f(u,v)+f′(u,v) 也满足流量守恒(这里只是略证,更多细节大家可以展开观察)。
4. 增广路径
在残留网络沿着容量大于 0 0 0 的边如果能够走到终点,这条路径称为增广路径。(注意:增广路径只是一条路径,而非一个网络)
5. 割
5.1 定义:
将点集 V V V 分成不重叠 S S S 和 T T T, 使得源点在 S S S,汇点在 T T T。
5.2 割的容量
c ( S , T ) = ∑ u ∈ S ∑ v ∈ T c ( u , v ) c(S,T)=\sum_{u\in S}\sum_{v\in T} c(u,v) c(S,T)=∑u∈S∑v∈Tc(u,v)
最小割: 最小的割的容量
5.3 割的流量
f ( S , T ) = ∑ u ∈ S ∑ v ∈ T f ( u , v ) − ∑ v ∈ S ∑ u ∈ T f ( u , v ) f(S,T)=\sum_{u\in S}\sum_{v\in T} f(u,v)-\sum_{v\in S}\sum_{u\in T} f(u,v) f(S,T)=∑u∈S∑v∈Tf(u,v)−∑v∈S∑u∈Tf(u,v)
性质1: ∀ [ S , T ] , f ( S , T ) ≤ c ( S , T ) \forall [S,T], f(S,T)\le c(S,T) ∀[S,T],f(S,T)≤c(S,T)
证明: 由于 f ( u , v ) f(u,v) f(u,v) 是大于等于 0 0 0 的,所以 f ( S , T ) ≤ ∑ u ∈ S ∑ v ∈ T f ( u , v ) f(S,T)\le \sum_{u\in S}\sum_{v\in T} f(u,v) f(S,T)≤∑u∈S∑v∈Tf(u,v),又因为有容量,所以一定 ≤ ∑ u ∈ S ∑ v ∈ T c ( u , v ) \le \sum_{u\in S}\sum_{v\in T} c(u,v) ≤∑u∈S∑v∈Tc(u,v) ,故 ∀ [ S , T ] , f ( S , T ) ≤ c ( S , T ) \forall [S,T], f(S,T)\le c(S,T) ∀[S,T],f(S,T)≤c(S,T)
性质2: ∀ [ S , T ] , f ( S , T ) = ∣ f ∣ \forall [S,T], f(S,T)= |f| ∀[S,T],f(S,T)=∣f∣
证明2:
f ( X , Y ) = ∑ u ∈ X ∑ v ∈ Y f ( u , v ) − ∑ v ∈ X ∑ u ∈ Y f ( u , v ) f(X,Y)=\sum_{u\in X}\sum_{v\in Y} f(u,v)-\sum_{v\in X}\sum_{u\in Y} f(u,v) f(X,Y)=∑u∈X∑v∈Yf(u,v)−∑v∈X∑u∈Yf(u,v)
则: f ( X , Y ) = − f ( Y , X ) f(X,Y)=-f(Y,X) f(X,Y)=−f(Y,X), f ( X , X ) = 0 f(X,X)=0 f(X,X)=0, f ( Z , X ∪ Y ) = f ( Z , X ) + f ( Z , Y ) , X ∩ Y = ∅ f(Z,X\cup Y)=f(Z,X)+f(Z,Y), X\cap Y= \varnothing f(Z,X∪Y)=f(Z,X)+f(Z,Y),X∩Y=∅
那么有:
∵
S
∪
T
=
V
,
S
∩
T
=
∅
,
∴
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
)
=
f
(
{
s
}
,
V
)
=
∣
f
∣
\begin{aligned} &\because S\cup T=V,S\cap T=\varnothing,\\ &\therefore f(S,V)=f(S,S)+f(S,T)\\ &\therefore f(S,T)=f(S,V)-f(S,S)=f(S,V)=f(\{s\},V)+f(S-\{s\},V)=f(\{s\},V)=|f|\\ \end{aligned}
∵S∪T=V,S∩T=∅,∴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)=f({s},V)=∣f∣
那么 ∣ f ∣ = f ( S , T ) ≤ c ( S , T ) |f|=f(S,T)\le c(S,T) ∣f∣=f(S,T)≤c(S,T)
即, ∣ f ∣ ≤ c ( S , T ) |f|\le c(S,T) ∣f∣≤c(S,T);故,最大流 ≤ \le ≤ 最小割
7. 最大流最小割定理
(1)可行流 f f f 是最大流
(2) G f G_f Gf 中不存在增广路
(3) ∣ f ∣ = c ( S , T ) |f|=c(S,T) ∣f∣=c(S,T)
在三个条件中,仅需知道 1 1 1 个,就能够推出另外 2 2 2 个,证明略。