网络流基础概念
流网络
流网络是一个有向图
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),被称为容量 . 在流网络中,有两个特殊的节点——源点
s
s
s,汇点
t
t
t.
流
设
G
=
(
V
,
E
)
G=(V,E)
G=(V,E) 为一个流网络,容量函数为
c
c
c,源点为
s
s
s,汇点为
t
t
t,定义
G
G
G 中的流
f
f
f 为
V
V
V 到
V
V
V 的实值二元关系:
V
×
V
→
R
V \times V \rightarrow R
V×V→R
对于
f
(
u
,
v
)
f(u,v)
f(u,v),满足:
- 容量限制:对于有向边 ( u , v ) ∈ E (u,v)\in E (u,v)∈E,流量不能超过该边的容量,即 0 ≤ f ( u , v ) ≤ c ( u , v ) 0\le f(u,v) \le c(u,v) 0≤f(u,v)≤c(u,v)
- 流量守恒:流入一个节点的流量必须等于流出该节点的流量,即 ∀ u ∈ V − { s , t } , ∑ v ∈ V f ( v , u ) = ∑ v ∈ V f ( u , v ) \forall \ u\in V-\{s,t\},\sum_{v\in V}f(v,u)=\sum_{v\in V}f(u,v) ∀ u∈V−{s,t},v∈V∑f(v,u)=v∈V∑f(u,v)
所以,定义整个网络的流量为,即从源点流出的净流量 f f f: ∣ f ∣ = ∑ ( s , u ) ∈ E f ( s , u ) − ∑ ( u , s ) ∈ E f ( u , s ) |f|=\sum_{(s,u)\in E}f(s,u)-\sum_{(u,s)\in E}f(u,s) ∣f∣=(s,u)∈E∑f(s,u)−(u,s)∈E∑f(u,s)
残存网络
在阐述残存网络的概念之前,首先铺垫剩余容量的概念,剩余容量
c
f
(
u
,
v
)
c_f(u,v)
cf(u,v) 是指
c
f
(
u
,
v
)
=
{
c
(
u
,
v
)
−
f
(
u
,
v
)
,
若
(
u
,
v
)
∈
E
f
(
v
,
u
)
,
若
(
v
,
u
)
∈
E
0
,
其
他
(1)
c_f(u,v)= \begin{cases} c(u,v)-f(u,v),\quad 若(u,v)\in E\\ f(v,u), \quad\quad\quad\quad\quad 若(v,u)\in E\\ 0,\quad\quad\quad\quad\quad\quad\quad\ 其他 \end{cases} \tag{1}
cf(u,v)=⎩⎪⎨⎪⎧c(u,v)−f(u,v),若(u,v)∈Ef(v,u),若(v,u)∈E0, 其他(1)
所以给定一个流网络
G
=
(
V
,
E
)
G=(V,E)
G=(V,E) 和一个流
f
f
f,则由
f
f
f 诱导的图
G
G
G 的残存网络为
G
f
=
(
V
,
E
f
)
G_f=(V,E_f)
Gf=(V,Ef),其中
E
f
E_f
Ef 为:
E
f
=
{
(
u
,
v
)
∈
V
×
V
,
c
f
(
u
,
v
)
>
0
}
E_f=\{(u,v)\in V\times V ,c_f(u,v)>0\}
Ef={(u,v)∈V×V,cf(u,v)>0}
增广路径
给定流网络 G = ( V , E ) G=(V,E) G=(V,E) 和流 f f f,增广路径 p p p 是残存网络 G f G_f Gf 中一条从源点到汇点的简单路径,且路径上的有向边的剩余容量 c f c_f cf 都大于零.
对于增广路径
p
p
p,能够为
∣
f
∣
|f|
∣f∣ 增加的流的值
c
f
(
p
)
c_f(p)
cf(p) 为:
c
f
(
p
)
=
m
i
n
{
c
f
(
u
,
v
)
,
(
u
,
v
)
∈
p
}
,
c
f
(
p
)
>
0
c_f(p)=min\{c_f(u,v),(u,v)\in p\},c_f(p)>0
cf(p)=min{cf(u,v),(u,v)∈p},cf(p)>0
增广后,
∣
f
′
∣
=
∣
f
∣
+
c
f
(
p
)
|f'|=|f|+c_f(p)
∣f′∣=∣f∣+cf(p)
切割
对于流网络 G = ( V , E ) G=(V,E) G=(V,E),定义该流网络的一个切割 ( S , T ) (S,T) (S,T),为把点集 V V V 划分为 S S S 与 T T T,满足 S ⋃ T = V , S ⋂ T = ∅ , s ∈ S , t ∈ T S\bigcup T=V,S\bigcap T=\varnothing,s\in S,t\in T S⋃T=V,S⋂T=∅,s∈S,t∈T.
定义横跨切割
(
S
,
V
)
(S,V)
(S,V) 的 净流量
f
(
S
,
T
)
f(S,T)
f(S,T) 为:
f
(
S
,
T
)
=
∣
f
∣
f(S,T)=|f|
f(S,T)=∣f∣
切割
(
S
,
V
)
(S,V)
(S,V) 的容量
c
(
S
,
T
)
c(S,T)
c(S,T) 为:
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∈T∑c(u,v)
最大流,最小割
最大流:在容量的限制下,求 m a x { ∣ f ∣ } max\{|f|\} max{∣f∣}
最小割:在流网络中,最小割为 m i n { c ( S , T ) } min\{c(S,T)\} min{c(S,T)}
最大流最小割定理
最大流最小割定理是网络流理论体系中的一条重要的定理,它是网络流算法的理论基础.
最大流最小割定理告诉我们两个重要的结论:
- 一个流是最大流当且仅当其残存网络不包含任何增广路径
- 在网络中,最大流的值等于最小割的容量
我们这里直接引用算法导论上的原话:
证明第一部分: f f f 是一个最大流 ⇒ \Rightarrow ⇒ 残存网络 G f G_f Gf不包括任何增广路径
反证法:
假设,若在
f
f
f 是一个最大流的情况下,残存网络中仍然存在增广路径。由增广路径的性质,我们知道,该增广路能够为
∣
f
∣
|f|
∣f∣ 增加
c
f
(
p
)
(
c
f
(
p
)
>
0
)
c_f(p)\ (c_f(p)>0)
cf(p) (cf(p)>0) 流的值,增广后的新总流为
∣
f
′
∣
=
∣
f
∣
+
c
f
(
p
)
>
∣
f
∣
|f'|=|f|+c_f(p)>|f|
∣f′∣=∣f∣+cf(p)>∣f∣ ,可知
f
f
f 不是一个最大流,矛盾,证毕.
证明第二部分:残存网络 G f G_f Gf不包括任何增广路径 ⇒ \Rightarrow ⇒ ∣ f ∣ = c ( S , T ) |f|=c(S,T) ∣f∣=c(S,T),其中 c ( S , T ) c(S,T) c(S,T)是流网络的一个切割.
证明:
S
t
e
p
1
:
Step1:
Step1:
首先,由于残存网络
G
f
G_f
Gf 中不包含增广路径,则在
G
f
G_f
Gf 中不存在从
s
s
s 到
t
t
t 的路径。
我们定义点集
S
S
S 与点集
T
T
T:
S
=
{
v
∈
V
,
在
G
f
中
与
s
连
通
}
S=\{v\in V,在 G_f 中与 s 连通\}
S={v∈V,在Gf中与s连通}
T
=
V
−
S
T=V-S
T=V−S
所以很显然,
s
∈
S
,
t
∈
T
s\in S,t\in T
s∈S,t∈T,即
(
S
,
T
)
(S,T)
(S,T) 是一个
V
V
V的划分,即
(
S
,
T
)
(S,T)
(S,T) 是
G
G
G 的一个切割
S
t
e
p
2
:
Step2:
Step2:
接着,在流网络
G
G
G 中,考虑一对节点
u
∈
S
,
v
∈
T
u\in S,v\in T
u∈S,v∈T,则有两个重要结论:
- 若 ( u , v ) ∈ E (u,v)\in E (u,v)∈E,则必有 f ( u , v ) = c ( u , v ) f(u,v)=c(u,v) f(u,v)=c(u,v) ,即该路径满流,为什么?
因为,若存在 f ( u , v ) < c ( u , v ) f(u,v)<c(u,v) f(u,v)<c(u,v) 即存在横跨切割 (从 S S S 到 T T T) 的未满流的边,那么在残存网络 G f G_f Gf 中, c f ( u , v ) > 0 c_f(u,v)>0 cf(u,v)>0,即存在 ( u , v ) ∈ E f (u,v)\in E_f (u,v)∈Ef,则 v ∈ S v\in S v∈S,不满足上述的划分,矛盾,所以横跨切割(从 S S S 到 T T T) 的路径必满流.
- 若 ( v , u ) ∈ E (v,u)\in E (v,u)∈E,则必有 f ( v , u ) = 0 f(v,u)=0 f(v,u)=0,即该路径零流,为什么?
因为,若
f
(
v
,
u
)
≠
0
f(v,u)\neq 0
f(v,u)=0,那么在残存网络中,
c
f
(
u
,
v
)
=
f
(
v
,
u
)
>
0
c_f(u,v)=f(v,u)>0
cf(u,v)=f(v,u)>0,即存在
(
u
,
v
)
∈
E
f
(u,v)\in E_f
(u,v)∈Ef,同理上述
不满足,所以横跨切割(从
T
T
T 到
S
S
S) 的路径必零流.
- 若 ( u , v ) ∉ E 且 ( v , u ) ∉ E (u,v)\notin E\ 且 \ (v,u)\notin E (u,v)∈/E 且 (v,u)∈/E,则 f ( u , v ) = f ( v , u ) = 0 f(u,v)=f(v,u)=0 f(u,v)=f(v,u)=0
S
t
e
p
3
:
Step3:
Step3:
由上述结论可知,对于网络的净流量
f
(
S
,
T
)
f(S,T)
f(S,T):
f
(
S
,
T
)
=
∑
u
∈
S
∑
v
∈
T
f
(
u
,
v
)
−
∑
u
∈
S
∑
v
∈
T
f
(
v
,
u
)
=
∑
u
∈
S
∑
v
∈
T
c
(
u
,
v
)
−
∑
u
∈
S
∑
v
∈
T
0
=
c
(
S
,
T
)
f(S,T)=\sum_{u\in S}\sum_{v\in T}f(u,v)-\sum_{u\in S}\sum_{v\in T}f(v,u)=\sum_{u\in S}\sum_{v\in T}c(u,v)-\sum_{u\in S}\sum_{v\in T}0=c(S,T)
f(S,T)=u∈S∑v∈T∑f(u,v)−u∈S∑v∈T∑f(v,u)=u∈S∑v∈T∑c(u,v)−u∈S∑v∈T∑0=c(S,T)
由净流量的结论可知:
f
(
S
,
T
)
=
∣
f
∣
f(S,T)=|f|
f(S,T)=∣f∣
所以:
∣
f
∣
=
f
(
S
,
T
)
=
c
(
S
,
T
)
≥
c
m
i
n
(
S
,
T
)
|f|=f(S,T)=c(S,T)\ge c_{min}(S,T)
∣f∣=f(S,T)=c(S,T)≥cmin(S,T)
而由证明第一部分可知:
∣
f
m
a
x
∣
=
c
(
S
,
T
)
≥
c
m
i
n
(
S
,
T
)
|f_{max}|=c(S,T)\ge c_{min}(S,T)
∣fmax∣=c(S,T)≥cmin(S,T)
证明第三部分:流网络的任意流 f f f 的值 ∣ f ∣ |f| ∣f∣ 不能超过 G G G 的任意切割的容量
证明:
设
f
f
f 为任意流,
(
S
,
T
)
(S,T)
(S,T) 为任意切割,可知:
∣
f
∣
=
f
(
S
,
T
)
=
∑
u
∈
S
∑
v
∈
T
f
(
u
,
v
)
−
∑
u
∈
S
∑
v
∈
T
f
(
v
,
u
)
|f|=f(S,T)=\sum_{u\in S}\sum_{v\in T}f(u,v)-\sum_{u\in S}\sum_{v\in T}f(v,u)
∣f∣=f(S,T)=u∈S∑v∈T∑f(u,v)−u∈S∑v∈T∑f(v,u)
≤
∑
u
∈
S
∑
v
∈
T
f
(
u
,
v
)
≤
∑
u
∈
S
∑
v
∈
T
c
(
u
,
v
)
=
c
(
S
,
T
)
\le \sum_{u\in S}\sum_{v\in T}f(u,v)\le \sum_{u\in S}\sum_{v\in T}c(u,v)=c(S,T)
≤u∈S∑v∈T∑f(u,v)≤u∈S∑v∈T∑c(u,v)=c(S,T)
由任意性,
∣
f
m
a
x
∣
≤
c
m
i
n
(
S
,
T
)
|f_{max}|\le c_{min}(S,T)
∣fmax∣≤cmin(S,T)
证明第四部分: ∣ f ∣ = c ( S , T ) |f|=c(S,T) ∣f∣=c(S,T),其中 c ( S , T ) c(S,T) c(S,T)是流网络的一个切割 ⇒ \Rightarrow ⇒ f f f 是一个最大流.
证明:
由证明第三部分,任意流都小于任意切割容量,则
∣
f
∣
=
c
(
S
,
T
)
|f|=c(S,T)
∣f∣=c(S,T) 总是隐含着一个最大流
证明第五部分:
m
a
x
{
∣
f
∣
}
=
c
m
i
n
(
S
,
T
)
max\{|f|\}=c_{min}(S,T)
max{∣f∣}=cmin(S,T)
由证明第二部分与证明第三部分分别可知,对于最大流
f
f
f,同时满足:
∣
f
m
a
x
∣
≥
c
m
i
n
(
S
,
T
)
,
∣
f
m
a
x
∣
≤
c
m
i
n
(
S
,
T
)
|f_{max}|\ge c_{min}(S,T),|f_{max}|\le c_{min}(S,T)
∣fmax∣≥cmin(S,T),∣fmax∣≤cmin(S,T)
所以:
m
a
x
{
∣
f
∣
}
=
c
m
i
n
(
S
,
T
)
max\{|f|\}=c_{min}(S,T)
max{∣f∣}=cmin(S,T)