1 基本概念和术语
( 1 ) 网络
G 是一个简单有向图, G=(V,E) , V={1 , 2 , … , n} 。在 V 中指定一个顶点 s ,称为源 和另一个顶点 t ,称为汇 。有向图 G 的每一条边 (v,w) ∈ E ,对应有一个值 cap(v,w)≥0 ,称为边的容量 。这样的有向图 G 称作一个网络 。
( 2 ) 网络流
网络上的流 是定义在网络的边集合 E 上的一个非负函数 flow={flow(v,w)} ,并称 flow(v,w) 为边 (v,w) 上的流量 。
( 3 ) 可行流
满足下述条件的流
flow
称为可行流
:
①
容量约束
:
对每一条边
(v,w)
∈
E
,
0≤flow(v,w)≤cap(v,w)
。
②
平衡约束
:
对于中间顶点:流出量
=
流入量。
即对每个
v
∈
V(v≠s,t)
有:顶点
v
的流出量-顶点
v
的流入量
=0
,即
对于源
s
:
s
的流出量-
s
的流入量
=
源的净输出量
f
,即
对于汇
t
:
t
的流入量-
t
的流出量的
=
汇的净输入量
f
,即
式中
f
称为这个可行流的流量,即源的净输出量
(
或汇的净输入量
)
。可行流总是存在的。
例如,让所有边的流量
flow(v,w)=0
,就得到一个其流量
f=0
的可行流
(
称为
0
流
)
。
( 4 ) 边流
对于网络 G 的一个给定的可行流 flow ,将网络中满足 flow(v,w)=cap(v,w) 的边称为饱和边 ; flow(v,w)<cap(v,w) 的边称为非饱和边 ; flow(v,w)=0 的边称为零流边 ; flow(v,w)>0 的边称为非零流边 。当边 (v,w) 既不是一条零流边也不是一条饱和边时,称为弱流边 。
( 5 ) 最大流
最大流问题即求网络 G 的一个可行流 flow ,使其流量 f 达到最大。即 flow 满足:0≤flow(v,w)≤cap(v,w) , (v,w) ∈ E ;且
( 6 ) 流的费用
实际应用中,与网络流有关的问题,不仅涉及流量,而且还有费用的因素。此时网络的每一条边 (v,w) 除了给定容量 cap(v,w) 外,还定义了一个单位流量费用 cost(v,w) 。对于网络中一个给定的流 flow ,其费用定义为:
( 7 ) 残流网络
对于给定的一个流网络
G
及其上的一个流
flow
,网络
G
关于流
flow
的残流网络
G*
与
G
有相同的顶点集
V
,而网络
G
中的每一条边对应于
G*
中的
1
条边或
2
条边。
设
(v,w)
是
G
的一条边。
当
flow(v,w)>0
时,(
w,v
)是
G*
中的一条边,该边的容量为
cap*(w,v)=flow(v,w)
;
当
flow(v,w)<cap(v,w)
时,
(v,w)
是
G*
中的一条边,该边的容量为cap*(v,w)=cap(v,w)-flow(v,w)
。
按照残流网络的定义,当原网络
G
中的边
(v,w)
是一条零流边时,残流网络
G*
中有唯一的一条边
(v,w)
与之对应,且该边的容量为
cap(v,w)
。
当原网络
G
中的边
(v,w)
是一条饱和边时,残流网络
G*
中有唯一的一条边
(w,v)
与之对应,且该边的容量为
cap(v,w)
。
当原网络
G
中的边
(v,w)
是一条弱流边时,残流网络
G*
中有
2
条边
(v,w)
和
(w,v)
与之对应,这
2
条边的容量分别为
cap(v,w) -flow(v,w)
和
flow(v,w)
。
残流网络是设计与网络流有关算法的重要工具。
增广路算法
1 算法基本思想
设P是网络G中联结源s和汇t的一条路。定义路的方向是从s到t。将路P上的边分成2类:一类边的方向与路的方向一致,称为向前边
。向前边的全体记为P+。另一类边的方向与路的方向相反,称为向后边
。向后边的全体记为P-。
设flow是一个可行流,P是从s到t的一条路,若P满足下列条件:
(1)在P的所有向前边(v,w)上,flow(v,w)<cap(v,w),即P+中的每一条边都是非饱和边;
(2)在P的所有向后边(v,w)上,flow(v,w)>0,即P-中的每一条边都是非零流边。
则称P为关于可行流flow的一条可增广路
。
可增广路是残流网络中一条容量大于0的路。
将具有上述特征的路P称为可增广路是因为可以通过修正路P上所有边流量flow(v,w)将当前可行流改进成一个流值更大的可行流。
增流的具体做法是:
(1)不属于可增广路P的边(v,w)上的流量保持不变;
(2)可增广路P上的所有边(v,w)上的流量按下述规则变化:
· 在向前边(v,w)上,flow(v,w)+d;
· 在向后边(v,w)上,flow(v,w)-d。
按下面的公式修改当前的流。
其中d称为可增广量,可按下述原则确定:d取得尽量大,又要使变化后的流仍为可行流。按照这个原则,d既不能超过每条向前边(v,w)的cap(v,w)-flow(v,w),也不能超过每条向后边(v,w)的flow(v,w)。因此d应该等于向前边上的cap(v,w)-flow(v,w)与向后边上的flow(v,w)的最小值。也就是残流网络中P的最大容量。
增广路定理
:设flow是网络G的一个可行流,如果不存在从s到t关于flow的可增广路P,则flow是G的一个最大流。
动画演示一:
动画演示二: