第九章 网络流理论
流
什么是流?
流就是永恒。
当生命停止,呼吸不再,
流,并未结束。
因为一个生命的终止是另一个生命的开始,
因为地球仍在运转,
太阳还在发光,
时间还在奔流。
个体的生命有限,
宇宙的生命无穷,
流,
与时光共存,
和无限相伴。
流是风,流是雨,
流是奔腾的江河,
流是起伏的山川。
流是婀娜的小草,
在微风中摇曳。
流是我缥缈的思绪,
在缥缈的地方遨游。
§ 9.1 网络与网络流的基本概念
定义 9.1.1 一个 网络 N=(V,A)是指一个连通无环弧且满足下列条件的有向图,
(1) 有一个顶点子集 X,其每个顶点的入度都为 0;
(2) 有一个与 X 不相交的顶点子集 Y,其每个顶点的出度都为 0;
(3) 每条弧都有一个非负的权,称为弧的容量。
注,上述网络 N 可写作 N=(V,X,Y,A,C),X 称为网络的发点集或源点集,Y 称为网络的收点集或汇点集,C 称为网络的容量函数。
例,
定义 9.1.2 网络 N=(V,X,Y,A,C)中的一个 (可行 )流 是指定义在 A 上的一个整值函数 f,
使得,
(1) 对,0 () ()aA fa ca?∈ ≤ ≤,(容量约束 );
(2) 对 (),()()vV X Y f v f v
+
∈? =∪,(流量守恒 )。
其中 ()f v
表示点 v 处入弧上的流量之和,()f v
+
表示点 v 处出弧上的流量之和。
注,(1) 可行流总是存在的,比如 0f ≡ 。
(2) 现实问题中有许多关于网络和流的实例。
比如:产销物资输送网络;输油管线网络;通信数据传输网络等。
定义 9.1.3 设 f 是网络 N=(V,X,Y,A,C)中的一个可行流,则必有 () ()f XfY
+?
= 。
()f X
+
(或 ()f Y
)称为流 f 的 流量,记为 Val f 。
网络最大流问题,给定网络 N=(V,X,Y,A,C),求 N 中流量最大的可行流 (称为最大流 )。
注,如果一个网络中的源点集和汇点集都只含一个顶点,则称该网络为单源单汇网络。任一网络 N=(V,X,Y,A,C)都可导出一个单源单汇网络。方法如下,
(1) 给 N 添加两个新顶点 s 和 t;
(2) 对 x X?∈,从 s 向 x 连一条弧,其容量为 ∞ (或
()
(,)
vN s
csv
+
∈
∑
);
(3) 对 yY?∈,从 y 向 t 连一条弧,其容量为 ∞ (或
()
(,)
uN t
cut
∈
∑
)。
新添的顶点 s 和 t 分别称为 人工源 和 人工汇,所得的新网络为 (,,,,)NV stAC′ ′′′。
y
1
x
2
x
1
v
2
y
3
v
1
x
3
y
2
v
3
v
4
4
4
4
2
2 2
2
2
22
2
22
2
2
1 1
3
v
1
y
v
3
v
2
v
4
x
2
x
1
3 6
5
2
3 4
1
2 5
2
3
此后的讨论中主要考虑单源单汇网络。
定义 9.1.4 设 N=(V,x,y,A,C)是一个单源单汇网络。 SV?,SVS=? 。用 (,)SS表示尾在 S 中而头在 S 中的所有弧的集合 (即从 S 中的点指向 S 之外点的所有弧之集 )。若 x S∈,
而 y S∈,则称弧集 (,)SS为网络 N 的一个 割 。一个割 (,)SS的 容量 是指 (,)SS中各条弧的容量之和,记为 Cap (,)SS。
例,对网络
令
1235
{,,,,}Sxvvvv=,则割 (,)SS
14 34 54 56
{,,,}vv vv vv vv= 。
注,一个网络 N 可能有多个割,各个割的容量不一定相等。其中容量最小的割称为 N 的
最小割 。
引理 9.1.1 对网络 N 中任一流 f 和任一割 (,)SS,均有
() ()Val f f S f S
+?
=?,
证明:设 f 是网络 N=(V,x,y,A,C)中的流,(,)SS是 N 的一个割,由流的定义,
(),() 0,() () 0,( {})f xValffx fv fv vSx
+?+?
== =?∈?。
故
{}
() () [ () ()] [ () ()]
[(,) (,)] (,) (,)
(,) (,) (,) (,).
vS x vS
vS u u vS u vS u
vSuS vSuS vSuS vSuS
Valf fx fx fv fv fv fv
fvu fuv fvu fuv
f vu f vu f uv f uv
+? +? +?
∈? ∈
∈∈
∈∈ ∈? ∈∈ ∈?
=?+?=?
=?=?
=+
∑ ∑
∑∑ ∑ ∑∑ ∑∑
∑∑ ∑∑ ∑∑ ∑∑
上式中第一式和第三式都表示 S 内部弧上流量之和,故相等;第二式表示从 S 的顶点指向
S 之外点的所有弧上流量之和,因此它等于 ()f S
+;第四式表示从 S 之外的顶点指向 S 中点的所有弧上的流量之和,因此等于 ()f S
。从而 () ()Val f f S f S
+?
=?。 证毕。
定义 9.1.5,对弧 a,若 () 0fa=,则称 a 是 f 零的;
若 () 0fa>,则称 a 是 f 正的;
若 () ()f aca=,则称 a 是 f 饱和的;
若 () ()f aca<,则称 a 是 f 非饱和的。
v
7v
1
v
4
v
3 v6
v
8
v
5
4
1
3
3
42
1
3
23
2
2 2
2
5
6
5
5
x
y
v
2
定理 9.1.1,对网络 N 中任一可行流 f 和任一割 K= (,)SS,均有 Val f CapK≤ 。其中等式成立当且仅当 (,)SS中每条弧都是 f 饱和的而且 (,)SS中每条弧都是 f 零的。
证明:因 f 是可行流,故
() () ()
aK aK
f S f a c a CapK
+
∈∈
=≤=
∑∑
,并且
(,)
() () 0
aSS
fS fa
∈
= ≥
∑
。
由引理 9.1.1,( ) ( )Val f f S f S CapK
+?
=?≤,可见第
一个结论成立。另外注意到 ()f S CapK
+
= 当且仅当
(,)SS中每条弧都是 f 饱和的;而 () 0fS
= 当且仅当
(,)SS 中每条弧都是 f 零的,故定理的第二个结论也成立。证毕。
注,网络 N 的一个割 K 称为 最小割,如果网络 N 中不存在割 K′使得 CapK CapK′< 。
推论 9.1.1 设
*
f 是网络 N 的一个最大流,K
*
是 N 的一个最小割,则
**
Val f CapK≤,
证明显然。
推论 9.1.2 设 f 是 N 的一个可行流,K 是 N 的一个割,若 Val f CapK=,则 f 是最大流而
K 是最小割。
证明:由推论 9.1.1,
**
Val f Val f CapK CapK≤≤ ≤,因 Val f CapK=,故由上式知,
*
Val f Val f=,
*
CapK CapK= 。
证毕。
S S
K
§ 9.2 最大流最小割定理及求最大流的标号算法
一、最大流最小割定理
问题:给定网络 (,,,,)NVxyAC=,如何求 N 中的最大流?
定义 9.2.1 设
1 k
Pxv vy= … 是网络 (,,,,)NVxyAC= 中一条 x-y 路 (无向 ),若弧
1
(,)
ii
vv A
+
∈,则称此弧为路 P 的一条 正向弧 (或称前向弧,顺向弧 ),若弧
1
(,)
ii
vv A
+
∈,则称此弧为路 P 的一条 反向弧
(或称后向弧,逆向弧 )。
例如,在右图所示的路 P 上,所有弧都是正向弧;
在路 Q 上,弧 (v
1
,v
3
)和 (v
2
,v
6
)是正向弧,而 (v
2
,v
4
)和
(v
4
,v
3
)是反向弧。 可见,一条弧是正向弧还是反向弧
与路有关。
定义 9.2.2 设 f 是网络 (,,,,)NVxyAC= 中的一可行流,P 是 N 中一条 x-y 路。如果对于 P 上任一条弧
a
null
,都有
(1) 若弧 a
null
是 P 的正向弧,则 () () () 0fa ca faΔ?>
nullnullnull
null ;
(2) 若弧 a
null
是 P 的反向弧,则 () () 0fa faΔ>
nullnull
null,
则称 P 是流 f 的一条 可增路 。沿路 P 可增加的流量为 () min ()
aP
f Pfa
∈
Δ =Δ
null
,称为路 P 上流的增量或可增量。
例如,在下图中,每条弧上括号内的数字表示弧的容量,括号外的数字是当前流的流量。图( 1)中虚线所示的路 P 是一条可增路。因
13
(,) 61 5fvvΔ =?=,
34
(,) 2fv vΔ =,
42
(,) 5fv vΔ=,
26
(,) 40 4fv vΔ=?=,故路 P 上的可增量 ( ) min{5,2,5,4} 2fPΔ ==。沿 P 增流后的流网络如图 (2)
所示。
图 (1) 图 (2)
由此可见,如果能找到 N 中一条 f 可增路,则可沿着 P 修改流的值,得到一个流值更大的新流
f,修改办法如下,
() ()
() () ()
(),
aP
aP
P
fa fP
fa fa fP
fa a
+Δ
=?Δ
null
null
null
nullnull
nullnull
若是的正向弧若是的反向弧不在上
,
,(*)
修改后的流值为:
()Val f Val f f P=+Δ。
这给出了求网络 N 的最大流的一个途径:反复找 N 中的可增路,沿可增路将流量扩大,直到找不出可增路为止。直观上想,此时应该已达到最大流。下面的定理证实了这一点。
P
Q
v
2
v
5
x
y
v
3
v
4
v
1
v
6
v
2
v
5
(x)
(y)
v
3
v
4
v
1
v
6
4(4)
3(6)
1(1)
0(3)
2(3)
3(5)
3(5)
0(1)
2(4)
5(5)
v
2
v
5
(x)
(y)
v
3
v
4
v
1
v
6
4(4)
1(6)
1(1)
2(3)
2(3)
5(5)
3(5)
0(1)
0(4)
5(5)
P
定理 9.2.1 (,,,,)NV x yAC 中的流 f 是 N 的最大流当且仅当 N 中不存在 f 可增路。
证明,:必要性:若 N 有 f 可增路,则 f 不是最大流,因为沿 P 按 (*)式修改流可得流值更大的流
f 。
充分性:设 N 中不存在 f 可增路,我们来证明 f 是最大流。令
{|SvV=∈从源 x 到 v 有可增路 }{}x∪,
则 y S?,而 x S∈,从而 (,)KSS= 是 N 中的一个割 (见割定义 )。
对 (,)SS 中的任一条弧 (,)auv=,必定 () ()f aca=,(否则,若 () ()f aca<,因 uS∈,从 x
到 u 有可增路 P,Pa+ 是 S 到 v 的可增路,故 vS∈,矛盾 );同理,对于 (,)SS中任一条弧
(,)avu=,必定 () 0fa= 。这说明 (,)SS 中每条弧都是 f 饱和的而 (,)SS中每条弧都是 f 零的。由定理 9.1.1,Val f CapK=,再由推论 9.1.2 便知 f 是最大流 (而且当前的 K 是最小割 )。
由定理 9.2.1 的证明立即可知,
推论 9.2.1 (最大流最小割定理,Ford,Fulkerson,1956) 任一个网络 N 中,最大流的流量等于最小割的容量。
由推论 9.2.1 又知,
推论 9.2.2 (整值最大流定理 ),任一网络中,若所有弧的容量都是整数,则最大流的流值也必为整数。
二、求最大流的 Ford- Fulkerson 标号法
前面已得到求网络 N 中最大流的一种思想:从一个已知流 (例如零流 )开始,递推地构作流值严格增加的流序列。在每一个新的流 f 得出之后,若能找到一条 f 可增路 P,则沿 P 修改流的值,得到一个更大的流
f,作为这个序列中的下一个流;若不存在
f 可增路,则由定理 9.1.1,f 就是最大流,算法终止。
问题,对一个流 f,如何找 f 可增路或判断 f 可增路不存在?
解答,Ford- Fulkerson 标号法,
标号过程描述,
设当前可行流为 f。
从源点 x 开始。首先给 x 标上∞,即 l(x)=∞,[ x 称为已标未查顶点,其它顶点称为未标未查顶点]。
任选一已标未查顶点 u,检查其所有尚未标号的邻点。
(1) 对 u 的尚未标号的出邻点 v (即 ()u,v A∈ ),若 (,) (,)cuv f uv>,则给 v 标号,
{ }() min (),(,) (,)lv lu cuv f uv=?,[ v 称为已标未查顶点];
否则,不给 v 标号。
(2) 对 u 的尚未标号的入邻点 v (即 ()v,u A∈ ),若 (,) 0fvu>,则将 v 标号,
{ }() min (),(,)lv lu f vu=,[ v 称为已标未查顶点];
否则,不给 v 标号。
当检查完 u 的所有邻点之后,u 称为已标已查顶点。
反复进行上述标、查过程,最终必出现两种结果之一,
(i) 汇点 y 获得标号,此时已得到 f 可增路。沿该路增流。
(ii) y 点未获得标号,但已没有已标未查顶点 (所有已标顶点都已被查,没有更多的新标号顶点 )。
此时当前的流 f 即为最大流 [设当前已标已查的顶点之集为 S,则 (,)SS 为最小割 ]
例如:网络 N(V,x,y,A,C)及其上一个流 f,(括号内数字是弧容量)。
情况 (i):获得一条 f 可增路 情况 (ii):已得到最大流和最小割
求网络最大流的 Ford- Fulkerson 标号算法,
输入:网络 (,,,,)NV x yAC
输出:网络 N 中一个最大流。
第 0 步 (初始化 ):对 aA?∈,令 () 0fa= ;
第 1 步:给源点 x 标号 (,)x ∞ 。,{},LxS==Φ。其中 L 表示已标未查集,S 表示已标已查集。
第 2 步:任取 uL∈,检查 u 的每个尚未标号的邻点 v。
(1) 若 ()vNu
+
∈,v 尚未标号且 (,) (,)Cuv f uv>,则给 v 标号 (,,())ulv+,其中
() min{(),(,) (,)}lv lu Cuv f uv=?。令,{}LLv= ∪ 。
(2) 若 ()vNu
∈,v 尚未标号且 (,) 0fvu>,则给 v 标号 (,,())ulv?,其中
() min{(),(,)}lv lu f vu= 。令,{}LLv= ∪ 。
第 3 步:重复第 2 步,直到汇点 y 被标号,或 y 未被标号但 L =Φ为止。
若是后者,算法结束,当前流是最大流;
若是前者,转下步。
第 4 步:令 zy= 。
第 5 步:若 z 的标号为 (,,()wlz+,则令 (,) (,) ()f wz f wz ly= + ;
若 z 的标号为 (,,()wlz?,则令 (,) (,) ( )f zw f zw ly=? 。
注,不论 z 是哪个点,此处总是 l (y),因 l (y)是最大的可增量 (沿可增路 )。
第 6 步:若 wx≠,则令 zw=,转第 5 步;
否则,去掉所有的顶点标号,转第 1 步。
v
4
v
1
v
3
x
y
v
2
7(7)
7(9)
5(8)
0(5)
5(9)
0(2)
0(6)
7(10)
5(5)
2
2
3
3
3
∞
v
4
v
1
v
3
x
y
v
2
7(7)
9(9)
7(8)
2(5)
5(9)
0(2)
0(6)
9(10)
5(5)
1
1 1
∞
例,
定理 9.2.2 标号算法结束时所得的流是最大流。
证明:算法结束时,L =Φ,所有已标顶点都已查,S 是所有已标已查顶点的集合。 S ≠Φ (因
y S∈ )。 按照标号规则,对 (,),() ()aSSfaCa?∈ = ;对 (,),() 0aSSfa? ∈=,(否则可得到新的标号顶点,算法不会终止 )。从而
(,) (,) (,) (,)
() () () () (,)
aSS aSS aSS aSS
Valf fa fa fa Ca CapSS
∈∈∈∈
=?===
∑∑∑∑
由推论 9.1.2,f 是最大流,而 (,)SS 是最小割。证毕。
三,Edmends- Karp 修改标号法,
Ford- Fulkerson 标号法的缺陷,
(1) 当弧容量为无理数时,可以构造出例子说明算法不能在有限步终止。
见 C.H.Papadimitry 等著,,Combinatorial Optimization- Algorithms & Complexity》§ 6.3,
或谢政著,《网络算法与复杂性理论》,国防科技大学出版社,2003 年。
(2) 即使弧容量都是有理数或整数,标号算法也不是一个有效算法。
例,
可见,标号算法的计算量并不完全依赖于问题的规模 ν 和 ε,还依赖于容量函数。它不是多项式时间算法。
v
4
v
1
v
5
v
3
x y
v
2
v
6
m
m
mm
mm
m
m
1
v
4
v
1
v
3
x
y
v
2
0(7)
0(9)
0(8)
0(5)
0(9)
0(2)
0(6)
0(10)
0(5)
(v
2
,+,7)(x,+,7)
(x,+,8)
(x,+,∞)
(v
4
,+,7)
(v
1
,+,8)
v
4
v
1
v
3
x
y
v
2
7(7)
7(9)
0(8)
0(5)
0(9)
0(2)
0(6)
7(10)
0(5)
(v
1
,+,5)
(x,+,8)
(x,+,∞)
(v
3
,+,5)
(v
1
,+,8)
增流
v
4
v
1
v
3
x
y
v
2
7(7)
7(9)
5(8)
0(5)
5(9)
0(2)
0(6)
7(10)
5(5)
(v
2
,+,2)(v1,+,3)
(x,+,3)
(x,+,∞)
(v
4
,+,2)
(v
1
,+,3)
v
4
v
1
v
3
x
y
v
2
7(7)
9(9)
7(8)
2(5)
5(9)
0(2)
0(6)
9(10)
5(5)
(v
1
,+,1)
(x,+,1)
(x,+,∞)
(v
1
,+,1)
增流 增流
Edmends- Karp 修改标号法,
在 Ford- Fulkerson 标号算法的第 2 步检查已标顶点时,采用“先标先查”规则。
例,
注,
① 先标先查规则,相当于执行广探法;
② 先标先查规则执行的结果相当于求 x 到 y 的最短可增路(层层推进策略);
③ Edmends- Karp 修改标号法是有效算法 (弧容量是有理数时 ),其计算复杂性为
2
()O ν ε? 。
§ 9.3 求最大流的 Dinic 算法
一、增量网络
定义 9.3.1 对于网络 N = (V,x,y,A,C)和 N 上的一个可行流 f,构造一个新的网络 N ( f )= (V,x,y,A( f ),
C′ ),其中 A( f )及容量函数 C′ 定义如下,
(1) 若 ()u,v A∈ 且 (,) (,)f uv Cuv<,则 (,) ( )uv A f∈,且 (,) (,) (,)Cuv Cuv fuv′ =? ;
(2) 若 ()u,v A∈ 且 (,) 0fuv>,则 (,) ( )vu A f∈,且 (,) (,)Cvu fuv′ = 。
这样构造的网络 N ( f )称为网络 N 关于流 f 的 增量网络 。
例,
注,
(1) 对应于 N 的每条饱和弧 (u,v),N ( f )中只有一条弧 (v,u),(,) (,) (,)cvu cuv fuv′ = = ;
对应于 N 的每条零流弧 (u,v),N ( f )中只有一条弧 (u,v),(,) (,) (,) (,)cuv cuv cuv fuv′ = =?;
对应于 N 的每条非零流非饱和弧 (u,v),N ( f )中有两条弧 (u,v)和 (v,u),(,) (,) (,)cuv cuv fuv′ =?,
(,) (,)cvu fuv′ = 。
(2) N ( f )中每条弧的容量恰为 N 中相应弧的流可增量。
(3) 严格来讲,增量网络不符合前述网络的定义 (无出度为 0 的点 (源 )和入度为 0 的点 (汇 )),但因它是在原网络 N 基础上定义的,有明显的源和汇的痕迹,因此我们仍将其看作网络,其中 x 和 y 分别为源和汇,该网络上的一个可行流 f 定义为满足
网络 N 及其一个可行流 f,弧上括号外数字为流量,括号内数字为容量。
2(2)
1(2)
2(3)
0(1)
2(3)
0(2)
1(3)
x
y
增量网络 N(f)。
2
1
1
1
1
2
2
x
y
1
1
2
2
v
3
v
4
v
2
v
1
1000
1000
1000
1000
v
5
x y
v
6
1000 1000
1000 1000
1
() () () 0
() () () 0
() () () 0
fx f x f x
fy f y f y
fu f u f u
+?
+?
+?
=?≥
=?≤
=?=
的流。
定理 9.3.1 设 f 是网络 N 中的一个可行流。则
(1) N 中 f 可增路与 N ( f )中的 x y? 有向路一一对应。
(2) N 中 f 可增路 P 的可增流值 ()f PΔ 等于 N ( f )中对应的 x y? 有向路 P
null
上最小的弧容量。
证明:显然。
定理 9.3..2 设
*
f 是网络 N 中的最大流,f 是 N 中的一个可行流,则增量网络 N ( f )中的最大流的流值为
*
Val f Val f? 。
证明:考虑 N ( f )中的任一个割 (,)SS,对 (,) (,)uv SS?∈,要么 (,) (,)cuv fvu′ = ;要么
(,) (,) (,)cuv cuv fuv′ =?【见注 (1)】。
令,{(,) (,) | (,) (,)}
1
A uv SS c uv f vu′=∈ =,
{(,) (,)| (,) (,) (,)}
2
A uv SS c uv cuv f uv′=∈ =?
则
12
AAφ=∩ 且 ()
12
AAAf=∪ 。
故
(,)(,)
(,) (,)
uv SS
Cap S S c u v
∈
′′=
∑
=
(,) (,)
(,) (,)
12
uv A uv A
cuv cuv
∈∈
′′+
∑∑
(,) (,)
(,) ((,) (,))
12
uv A uv A
f vu cuv f uv
∈∈
=+?
∑∑
(,) (,) (,)
(,) (,) (,)
21 2
uv A uv A uv A
cuv f vu f uv
∈∈ ∈
=+?
∑∑∑
(,Cap S S=)() ()f SfS
+
+? (,)Cap S S Val f=?。
当 f 给定后 min (,) min (,)Cap S S Cap S S Valf′ =?。由最大流最小割定理,
**
Val f Val f Val f=?
null
,
其中
*
f
null
表示 ()Nf中的最大流。
二、网络顶点的分层,
设网络 N = (V,x,y,A,C),令,{|
i
VvV=∈x 到 v 的最短有向路的长为 i}。设 x 到 y 的最短有向路的长为 n,则 (1),
0 n
x VyV∈∈; (2)
ij
VV=∩ φ,()ji≠ 。
i
V 中的顶点称为网络 N 的第 i 层顶点。
注,这里有向路的长指有向路上有向边的数目。最短有向路指含有向边数最少的有向路。
例,
{},{,},{,,,}
01122345
VxVvvVvvvy= ==
S S
u v
u v
u v
u v
N
N(f)
非零非饱和弧饱和弧零流弧非零非饱和弧
S S
u v
u v
u v
u v
∈A
1
∈A
1
∈A
2
∈A
2
网络 N 网络 N 的分层。
v
1
x
y
v
3
v
2
v
4
v
5
v
1
x
y
v
3
v
2
v
4
v
5
注,(1) 网络顶点分层后,弧有三种可能的情况,
流
什么是流?
流就是永恒。
当生命停止,呼吸不再,
流,并未结束。
因为一个生命的终止是另一个生命的开始,
因为地球仍在运转,
太阳还在发光,
时间还在奔流。
个体的生命有限,
宇宙的生命无穷,
流,
与时光共存,
和无限相伴。
流是风,流是雨,
流是奔腾的江河,
流是起伏的山川。
流是婀娜的小草,
在微风中摇曳。
流是我缥缈的思绪,
在缥缈的地方遨游。
§ 9.1 网络与网络流的基本概念
定义 9.1.1 一个 网络 N=(V,A)是指一个连通无环弧且满足下列条件的有向图,
(1) 有一个顶点子集 X,其每个顶点的入度都为 0;
(2) 有一个与 X 不相交的顶点子集 Y,其每个顶点的出度都为 0;
(3) 每条弧都有一个非负的权,称为弧的容量。
注,上述网络 N 可写作 N=(V,X,Y,A,C),X 称为网络的发点集或源点集,Y 称为网络的收点集或汇点集,C 称为网络的容量函数。
例,
定义 9.1.2 网络 N=(V,X,Y,A,C)中的一个 (可行 )流 是指定义在 A 上的一个整值函数 f,
使得,
(1) 对,0 () ()aA fa ca?∈ ≤ ≤,(容量约束 );
(2) 对 (),()()vV X Y f v f v
+
∈? =∪,(流量守恒 )。
其中 ()f v
表示点 v 处入弧上的流量之和,()f v
+
表示点 v 处出弧上的流量之和。
注,(1) 可行流总是存在的,比如 0f ≡ 。
(2) 现实问题中有许多关于网络和流的实例。
比如:产销物资输送网络;输油管线网络;通信数据传输网络等。
定义 9.1.3 设 f 是网络 N=(V,X,Y,A,C)中的一个可行流,则必有 () ()f XfY
+?
= 。
()f X
+
(或 ()f Y
)称为流 f 的 流量,记为 Val f 。
网络最大流问题,给定网络 N=(V,X,Y,A,C),求 N 中流量最大的可行流 (称为最大流 )。
注,如果一个网络中的源点集和汇点集都只含一个顶点,则称该网络为单源单汇网络。任一网络 N=(V,X,Y,A,C)都可导出一个单源单汇网络。方法如下,
(1) 给 N 添加两个新顶点 s 和 t;
(2) 对 x X?∈,从 s 向 x 连一条弧,其容量为 ∞ (或
()
(,)
vN s
csv
+
∈
∑
);
(3) 对 yY?∈,从 y 向 t 连一条弧,其容量为 ∞ (或
()
(,)
uN t
cut
∈
∑
)。
新添的顶点 s 和 t 分别称为 人工源 和 人工汇,所得的新网络为 (,,,,)NV stAC′ ′′′。
y
1
x
2
x
1
v
2
y
3
v
1
x
3
y
2
v
3
v
4
4
4
4
2
2 2
2
2
22
2
22
2
2
1 1
3
v
1
y
v
3
v
2
v
4
x
2
x
1
3 6
5
2
3 4
1
2 5
2
3
此后的讨论中主要考虑单源单汇网络。
定义 9.1.4 设 N=(V,x,y,A,C)是一个单源单汇网络。 SV?,SVS=? 。用 (,)SS表示尾在 S 中而头在 S 中的所有弧的集合 (即从 S 中的点指向 S 之外点的所有弧之集 )。若 x S∈,
而 y S∈,则称弧集 (,)SS为网络 N 的一个 割 。一个割 (,)SS的 容量 是指 (,)SS中各条弧的容量之和,记为 Cap (,)SS。
例,对网络
令
1235
{,,,,}Sxvvvv=,则割 (,)SS
14 34 54 56
{,,,}vv vv vv vv= 。
注,一个网络 N 可能有多个割,各个割的容量不一定相等。其中容量最小的割称为 N 的
最小割 。
引理 9.1.1 对网络 N 中任一流 f 和任一割 (,)SS,均有
() ()Val f f S f S
+?
=?,
证明:设 f 是网络 N=(V,x,y,A,C)中的流,(,)SS是 N 的一个割,由流的定义,
(),() 0,() () 0,( {})f xValffx fv fv vSx
+?+?
== =?∈?。
故
{}
() () [ () ()] [ () ()]
[(,) (,)] (,) (,)
(,) (,) (,) (,).
vS x vS
vS u u vS u vS u
vSuS vSuS vSuS vSuS
Valf fx fx fv fv fv fv
fvu fuv fvu fuv
f vu f vu f uv f uv
+? +? +?
∈? ∈
∈∈
∈∈ ∈? ∈∈ ∈?
=?+?=?
=?=?
=+
∑ ∑
∑∑ ∑ ∑∑ ∑∑
∑∑ ∑∑ ∑∑ ∑∑
上式中第一式和第三式都表示 S 内部弧上流量之和,故相等;第二式表示从 S 的顶点指向
S 之外点的所有弧上流量之和,因此它等于 ()f S
+;第四式表示从 S 之外的顶点指向 S 中点的所有弧上的流量之和,因此等于 ()f S
。从而 () ()Val f f S f S
+?
=?。 证毕。
定义 9.1.5,对弧 a,若 () 0fa=,则称 a 是 f 零的;
若 () 0fa>,则称 a 是 f 正的;
若 () ()f aca=,则称 a 是 f 饱和的;
若 () ()f aca<,则称 a 是 f 非饱和的。
v
7v
1
v
4
v
3 v6
v
8
v
5
4
1
3
3
42
1
3
23
2
2 2
2
5
6
5
5
x
y
v
2
定理 9.1.1,对网络 N 中任一可行流 f 和任一割 K= (,)SS,均有 Val f CapK≤ 。其中等式成立当且仅当 (,)SS中每条弧都是 f 饱和的而且 (,)SS中每条弧都是 f 零的。
证明:因 f 是可行流,故
() () ()
aK aK
f S f a c a CapK
+
∈∈
=≤=
∑∑
,并且
(,)
() () 0
aSS
fS fa
∈
= ≥
∑
。
由引理 9.1.1,( ) ( )Val f f S f S CapK
+?
=?≤,可见第
一个结论成立。另外注意到 ()f S CapK
+
= 当且仅当
(,)SS中每条弧都是 f 饱和的;而 () 0fS
= 当且仅当
(,)SS 中每条弧都是 f 零的,故定理的第二个结论也成立。证毕。
注,网络 N 的一个割 K 称为 最小割,如果网络 N 中不存在割 K′使得 CapK CapK′< 。
推论 9.1.1 设
*
f 是网络 N 的一个最大流,K
*
是 N 的一个最小割,则
**
Val f CapK≤,
证明显然。
推论 9.1.2 设 f 是 N 的一个可行流,K 是 N 的一个割,若 Val f CapK=,则 f 是最大流而
K 是最小割。
证明:由推论 9.1.1,
**
Val f Val f CapK CapK≤≤ ≤,因 Val f CapK=,故由上式知,
*
Val f Val f=,
*
CapK CapK= 。
证毕。
S S
K
§ 9.2 最大流最小割定理及求最大流的标号算法
一、最大流最小割定理
问题:给定网络 (,,,,)NVxyAC=,如何求 N 中的最大流?
定义 9.2.1 设
1 k
Pxv vy= … 是网络 (,,,,)NVxyAC= 中一条 x-y 路 (无向 ),若弧
1
(,)
ii
vv A
+
∈,则称此弧为路 P 的一条 正向弧 (或称前向弧,顺向弧 ),若弧
1
(,)
ii
vv A
+
∈,则称此弧为路 P 的一条 反向弧
(或称后向弧,逆向弧 )。
例如,在右图所示的路 P 上,所有弧都是正向弧;
在路 Q 上,弧 (v
1
,v
3
)和 (v
2
,v
6
)是正向弧,而 (v
2
,v
4
)和
(v
4
,v
3
)是反向弧。 可见,一条弧是正向弧还是反向弧
与路有关。
定义 9.2.2 设 f 是网络 (,,,,)NVxyAC= 中的一可行流,P 是 N 中一条 x-y 路。如果对于 P 上任一条弧
a
null
,都有
(1) 若弧 a
null
是 P 的正向弧,则 () () () 0fa ca faΔ?>
nullnullnull
null ;
(2) 若弧 a
null
是 P 的反向弧,则 () () 0fa faΔ>
nullnull
null,
则称 P 是流 f 的一条 可增路 。沿路 P 可增加的流量为 () min ()
aP
f Pfa
∈
Δ =Δ
null
,称为路 P 上流的增量或可增量。
例如,在下图中,每条弧上括号内的数字表示弧的容量,括号外的数字是当前流的流量。图( 1)中虚线所示的路 P 是一条可增路。因
13
(,) 61 5fvvΔ =?=,
34
(,) 2fv vΔ =,
42
(,) 5fv vΔ=,
26
(,) 40 4fv vΔ=?=,故路 P 上的可增量 ( ) min{5,2,5,4} 2fPΔ ==。沿 P 增流后的流网络如图 (2)
所示。
图 (1) 图 (2)
由此可见,如果能找到 N 中一条 f 可增路,则可沿着 P 修改流的值,得到一个流值更大的新流
f,修改办法如下,
() ()
() () ()
(),
aP
aP
P
fa fP
fa fa fP
fa a
+Δ
=?Δ
null
null
null
nullnull
nullnull
若是的正向弧若是的反向弧不在上
,
,(*)
修改后的流值为:
()Val f Val f f P=+Δ。
这给出了求网络 N 的最大流的一个途径:反复找 N 中的可增路,沿可增路将流量扩大,直到找不出可增路为止。直观上想,此时应该已达到最大流。下面的定理证实了这一点。
P
Q
v
2
v
5
x
y
v
3
v
4
v
1
v
6
v
2
v
5
(x)
(y)
v
3
v
4
v
1
v
6
4(4)
3(6)
1(1)
0(3)
2(3)
3(5)
3(5)
0(1)
2(4)
5(5)
v
2
v
5
(x)
(y)
v
3
v
4
v
1
v
6
4(4)
1(6)
1(1)
2(3)
2(3)
5(5)
3(5)
0(1)
0(4)
5(5)
P
定理 9.2.1 (,,,,)NV x yAC 中的流 f 是 N 的最大流当且仅当 N 中不存在 f 可增路。
证明,:必要性:若 N 有 f 可增路,则 f 不是最大流,因为沿 P 按 (*)式修改流可得流值更大的流
f 。
充分性:设 N 中不存在 f 可增路,我们来证明 f 是最大流。令
{|SvV=∈从源 x 到 v 有可增路 }{}x∪,
则 y S?,而 x S∈,从而 (,)KSS= 是 N 中的一个割 (见割定义 )。
对 (,)SS 中的任一条弧 (,)auv=,必定 () ()f aca=,(否则,若 () ()f aca<,因 uS∈,从 x
到 u 有可增路 P,Pa+ 是 S 到 v 的可增路,故 vS∈,矛盾 );同理,对于 (,)SS中任一条弧
(,)avu=,必定 () 0fa= 。这说明 (,)SS 中每条弧都是 f 饱和的而 (,)SS中每条弧都是 f 零的。由定理 9.1.1,Val f CapK=,再由推论 9.1.2 便知 f 是最大流 (而且当前的 K 是最小割 )。
由定理 9.2.1 的证明立即可知,
推论 9.2.1 (最大流最小割定理,Ford,Fulkerson,1956) 任一个网络 N 中,最大流的流量等于最小割的容量。
由推论 9.2.1 又知,
推论 9.2.2 (整值最大流定理 ),任一网络中,若所有弧的容量都是整数,则最大流的流值也必为整数。
二、求最大流的 Ford- Fulkerson 标号法
前面已得到求网络 N 中最大流的一种思想:从一个已知流 (例如零流 )开始,递推地构作流值严格增加的流序列。在每一个新的流 f 得出之后,若能找到一条 f 可增路 P,则沿 P 修改流的值,得到一个更大的流
f,作为这个序列中的下一个流;若不存在
f 可增路,则由定理 9.1.1,f 就是最大流,算法终止。
问题,对一个流 f,如何找 f 可增路或判断 f 可增路不存在?
解答,Ford- Fulkerson 标号法,
标号过程描述,
设当前可行流为 f。
从源点 x 开始。首先给 x 标上∞,即 l(x)=∞,[ x 称为已标未查顶点,其它顶点称为未标未查顶点]。
任选一已标未查顶点 u,检查其所有尚未标号的邻点。
(1) 对 u 的尚未标号的出邻点 v (即 ()u,v A∈ ),若 (,) (,)cuv f uv>,则给 v 标号,
{ }() min (),(,) (,)lv lu cuv f uv=?,[ v 称为已标未查顶点];
否则,不给 v 标号。
(2) 对 u 的尚未标号的入邻点 v (即 ()v,u A∈ ),若 (,) 0fvu>,则将 v 标号,
{ }() min (),(,)lv lu f vu=,[ v 称为已标未查顶点];
否则,不给 v 标号。
当检查完 u 的所有邻点之后,u 称为已标已查顶点。
反复进行上述标、查过程,最终必出现两种结果之一,
(i) 汇点 y 获得标号,此时已得到 f 可增路。沿该路增流。
(ii) y 点未获得标号,但已没有已标未查顶点 (所有已标顶点都已被查,没有更多的新标号顶点 )。
此时当前的流 f 即为最大流 [设当前已标已查的顶点之集为 S,则 (,)SS 为最小割 ]
例如:网络 N(V,x,y,A,C)及其上一个流 f,(括号内数字是弧容量)。
情况 (i):获得一条 f 可增路 情况 (ii):已得到最大流和最小割
求网络最大流的 Ford- Fulkerson 标号算法,
输入:网络 (,,,,)NV x yAC
输出:网络 N 中一个最大流。
第 0 步 (初始化 ):对 aA?∈,令 () 0fa= ;
第 1 步:给源点 x 标号 (,)x ∞ 。,{},LxS==Φ。其中 L 表示已标未查集,S 表示已标已查集。
第 2 步:任取 uL∈,检查 u 的每个尚未标号的邻点 v。
(1) 若 ()vNu
+
∈,v 尚未标号且 (,) (,)Cuv f uv>,则给 v 标号 (,,())ulv+,其中
() min{(),(,) (,)}lv lu Cuv f uv=?。令,{}LLv= ∪ 。
(2) 若 ()vNu
∈,v 尚未标号且 (,) 0fvu>,则给 v 标号 (,,())ulv?,其中
() min{(),(,)}lv lu f vu= 。令,{}LLv= ∪ 。
第 3 步:重复第 2 步,直到汇点 y 被标号,或 y 未被标号但 L =Φ为止。
若是后者,算法结束,当前流是最大流;
若是前者,转下步。
第 4 步:令 zy= 。
第 5 步:若 z 的标号为 (,,()wlz+,则令 (,) (,) ()f wz f wz ly= + ;
若 z 的标号为 (,,()wlz?,则令 (,) (,) ( )f zw f zw ly=? 。
注,不论 z 是哪个点,此处总是 l (y),因 l (y)是最大的可增量 (沿可增路 )。
第 6 步:若 wx≠,则令 zw=,转第 5 步;
否则,去掉所有的顶点标号,转第 1 步。
v
4
v
1
v
3
x
y
v
2
7(7)
7(9)
5(8)
0(5)
5(9)
0(2)
0(6)
7(10)
5(5)
2
2
3
3
3
∞
v
4
v
1
v
3
x
y
v
2
7(7)
9(9)
7(8)
2(5)
5(9)
0(2)
0(6)
9(10)
5(5)
1
1 1
∞
例,
定理 9.2.2 标号算法结束时所得的流是最大流。
证明:算法结束时,L =Φ,所有已标顶点都已查,S 是所有已标已查顶点的集合。 S ≠Φ (因
y S∈ )。 按照标号规则,对 (,),() ()aSSfaCa?∈ = ;对 (,),() 0aSSfa? ∈=,(否则可得到新的标号顶点,算法不会终止 )。从而
(,) (,) (,) (,)
() () () () (,)
aSS aSS aSS aSS
Valf fa fa fa Ca CapSS
∈∈∈∈
=?===
∑∑∑∑
由推论 9.1.2,f 是最大流,而 (,)SS 是最小割。证毕。
三,Edmends- Karp 修改标号法,
Ford- Fulkerson 标号法的缺陷,
(1) 当弧容量为无理数时,可以构造出例子说明算法不能在有限步终止。
见 C.H.Papadimitry 等著,,Combinatorial Optimization- Algorithms & Complexity》§ 6.3,
或谢政著,《网络算法与复杂性理论》,国防科技大学出版社,2003 年。
(2) 即使弧容量都是有理数或整数,标号算法也不是一个有效算法。
例,
可见,标号算法的计算量并不完全依赖于问题的规模 ν 和 ε,还依赖于容量函数。它不是多项式时间算法。
v
4
v
1
v
5
v
3
x y
v
2
v
6
m
m
mm
mm
m
m
1
v
4
v
1
v
3
x
y
v
2
0(7)
0(9)
0(8)
0(5)
0(9)
0(2)
0(6)
0(10)
0(5)
(v
2
,+,7)(x,+,7)
(x,+,8)
(x,+,∞)
(v
4
,+,7)
(v
1
,+,8)
v
4
v
1
v
3
x
y
v
2
7(7)
7(9)
0(8)
0(5)
0(9)
0(2)
0(6)
7(10)
0(5)
(v
1
,+,5)
(x,+,8)
(x,+,∞)
(v
3
,+,5)
(v
1
,+,8)
增流
v
4
v
1
v
3
x
y
v
2
7(7)
7(9)
5(8)
0(5)
5(9)
0(2)
0(6)
7(10)
5(5)
(v
2
,+,2)(v1,+,3)
(x,+,3)
(x,+,∞)
(v
4
,+,2)
(v
1
,+,3)
v
4
v
1
v
3
x
y
v
2
7(7)
9(9)
7(8)
2(5)
5(9)
0(2)
0(6)
9(10)
5(5)
(v
1
,+,1)
(x,+,1)
(x,+,∞)
(v
1
,+,1)
增流 增流
Edmends- Karp 修改标号法,
在 Ford- Fulkerson 标号算法的第 2 步检查已标顶点时,采用“先标先查”规则。
例,
注,
① 先标先查规则,相当于执行广探法;
② 先标先查规则执行的结果相当于求 x 到 y 的最短可增路(层层推进策略);
③ Edmends- Karp 修改标号法是有效算法 (弧容量是有理数时 ),其计算复杂性为
2
()O ν ε? 。
§ 9.3 求最大流的 Dinic 算法
一、增量网络
定义 9.3.1 对于网络 N = (V,x,y,A,C)和 N 上的一个可行流 f,构造一个新的网络 N ( f )= (V,x,y,A( f ),
C′ ),其中 A( f )及容量函数 C′ 定义如下,
(1) 若 ()u,v A∈ 且 (,) (,)f uv Cuv<,则 (,) ( )uv A f∈,且 (,) (,) (,)Cuv Cuv fuv′ =? ;
(2) 若 ()u,v A∈ 且 (,) 0fuv>,则 (,) ( )vu A f∈,且 (,) (,)Cvu fuv′ = 。
这样构造的网络 N ( f )称为网络 N 关于流 f 的 增量网络 。
例,
注,
(1) 对应于 N 的每条饱和弧 (u,v),N ( f )中只有一条弧 (v,u),(,) (,) (,)cvu cuv fuv′ = = ;
对应于 N 的每条零流弧 (u,v),N ( f )中只有一条弧 (u,v),(,) (,) (,) (,)cuv cuv cuv fuv′ = =?;
对应于 N 的每条非零流非饱和弧 (u,v),N ( f )中有两条弧 (u,v)和 (v,u),(,) (,) (,)cuv cuv fuv′ =?,
(,) (,)cvu fuv′ = 。
(2) N ( f )中每条弧的容量恰为 N 中相应弧的流可增量。
(3) 严格来讲,增量网络不符合前述网络的定义 (无出度为 0 的点 (源 )和入度为 0 的点 (汇 )),但因它是在原网络 N 基础上定义的,有明显的源和汇的痕迹,因此我们仍将其看作网络,其中 x 和 y 分别为源和汇,该网络上的一个可行流 f 定义为满足
网络 N 及其一个可行流 f,弧上括号外数字为流量,括号内数字为容量。
2(2)
1(2)
2(3)
0(1)
2(3)
0(2)
1(3)
x
y
增量网络 N(f)。
2
1
1
1
1
2
2
x
y
1
1
2
2
v
3
v
4
v
2
v
1
1000
1000
1000
1000
v
5
x y
v
6
1000 1000
1000 1000
1
() () () 0
() () () 0
() () () 0
fx f x f x
fy f y f y
fu f u f u
+?
+?
+?
=?≥
=?≤
=?=
的流。
定理 9.3.1 设 f 是网络 N 中的一个可行流。则
(1) N 中 f 可增路与 N ( f )中的 x y? 有向路一一对应。
(2) N 中 f 可增路 P 的可增流值 ()f PΔ 等于 N ( f )中对应的 x y? 有向路 P
null
上最小的弧容量。
证明:显然。
定理 9.3..2 设
*
f 是网络 N 中的最大流,f 是 N 中的一个可行流,则增量网络 N ( f )中的最大流的流值为
*
Val f Val f? 。
证明:考虑 N ( f )中的任一个割 (,)SS,对 (,) (,)uv SS?∈,要么 (,) (,)cuv fvu′ = ;要么
(,) (,) (,)cuv cuv fuv′ =?【见注 (1)】。
令,{(,) (,) | (,) (,)}
1
A uv SS c uv f vu′=∈ =,
{(,) (,)| (,) (,) (,)}
2
A uv SS c uv cuv f uv′=∈ =?
则
12
AAφ=∩ 且 ()
12
AAAf=∪ 。
故
(,)(,)
(,) (,)
uv SS
Cap S S c u v
∈
′′=
∑
=
(,) (,)
(,) (,)
12
uv A uv A
cuv cuv
∈∈
′′+
∑∑
(,) (,)
(,) ((,) (,))
12
uv A uv A
f vu cuv f uv
∈∈
=+?
∑∑
(,) (,) (,)
(,) (,) (,)
21 2
uv A uv A uv A
cuv f vu f uv
∈∈ ∈
=+?
∑∑∑
(,Cap S S=)() ()f SfS
+
+? (,)Cap S S Val f=?。
当 f 给定后 min (,) min (,)Cap S S Cap S S Valf′ =?。由最大流最小割定理,
**
Val f Val f Val f=?
null
,
其中
*
f
null
表示 ()Nf中的最大流。
二、网络顶点的分层,
设网络 N = (V,x,y,A,C),令,{|
i
VvV=∈x 到 v 的最短有向路的长为 i}。设 x 到 y 的最短有向路的长为 n,则 (1),
0 n
x VyV∈∈; (2)
ij
VV=∩ φ,()ji≠ 。
i
V 中的顶点称为网络 N 的第 i 层顶点。
注,这里有向路的长指有向路上有向边的数目。最短有向路指含有向边数最少的有向路。
例,
{},{,},{,,,}
01122345
VxVvvVvvvy= ==
S S
u v
u v
u v
u v
N
N(f)
非零非饱和弧饱和弧零流弧非零非饱和弧
S S
u v
u v
u v
u v
∈A
1
∈A
1
∈A
2
∈A
2
网络 N 网络 N 的分层。
v
1
x
y
v
3
v
2
v
4
v
5
v
1
x
y
v
3
v
2
v
4
v
5
注,(1) 网络顶点分层后,弧有三种可能的情况,