流网络初步
此文,我们来到了图论里面最重要的专题——流网络。此文正如标题所说,介绍一些流网络中常见的概念和定理。
流网络和流
流网络是一个有向图 G = ( V , E ) G=(V,E) G=(V,E),图中每一条边都有一个非负的容量值 c ( u , v ) ≥ 0 c(u,v) \geq 0 c(u,v)≥0。而且,如果边集合包含一条边 ( u , v ) (u,v) (u,v),就不会存在反向边 ( v , u ) (v,u) (v,u)。为了方便起见,如果 ( u , v ) ∉ E (u,v) \notin E (u,v)∈/E,那么 c ( u , v ) = 0 c(u,v) = 0 c(u,v)=0。并且图中不允许出现自环。并且在流网络中,有两个独一无二的节点,源节点s和汇点t。也就是说,对于一个节点v既不是源节点s又不是汇点t,那么必定存在一条路径 s → v → t s \to v \to t s→v→t。因此,流网络图是连通的,并且除了源节点的节点都至少有一个入边(源节点可以有也可以没有入边)。我们有 ∣ E ∣ ≥ ∣ V ∣ − 1 |E| \geq |V|-1 ∣E∣≥∣V∣−1。
流(网络流)则是一个实值函数 f : V × V → ℜ f : V \times V \to \real f:V×V→ℜ。满足下列两条性质:
- 容量限制:对于所有的节点 u , v ∈ V u,v \in V u,v∈V, 0 ≤ f ( u , v ) ≤ c ( u , v ) 0 \leq f(u,v) \leq c(u,v) 0≤f(u,v)≤c(u,v)。(即一条边的不能超过这条边的容量。)
- 流量守恒:对于所有节点 u ∈ V − { s , t } u \in V - \{s,t\} u∈V−{s,t},要求$\sum_{v \in V}f(u,v) = ∑ v ∈ V f ( v , u ) \sum_{v \in V}f(v,u) ∑v∈Vf(v,u)。(即流入某一个节点的流量等于流出某一个节点的流量。)
同样,为了方便,如果 ( u , v ) ∉ E (u,v) \notin E (u,v)∈/E,那么 f ( u , v ) = 0 f(u,v) = 0 f(u,v)=0。因此,我们称非负数值 f ( u , v ) f(u,v) f(u,v)为从节点 u u u到节点 v v v的流量。
对于一个流 f f f,值 ∣ f ∣ |f| ∣f∣表示:
∣ f ∣ = ∑ v ∈ V f ( s , v ) − ∑ v ∈ V f ( v , s ) |f| = \sum_{v \in V} f(s,v) - \sum_{v \in V} f(v,s) ∣f∣=v∈V∑f(s,v)−v∈V∑f(v,s)
也就是说,值 ∣ f ∣ |f| ∣f∣表示从源节点流出的净流量。如果源节点没有入边,那么最后一项为0,因此 ∣ f ∣ |f| ∣f∣表示从源节点流出的流量的总和。
具有平行边和多源节点和汇点的流网络构建
如果我们遇到了具有平行边和多源节点和汇点的流网络构建。对于具有平行边的两个节点 u , v u,v u,v,即存在边 ( u , v ) , ( v , u ) ∈ E (u,v) , (v,u) \in E (u,v),(v,u)∈E,我们可以任意选择一条边,例如我们选择 ( u , v ) (u,v) (u,v)把这个边替换成从 u u u到中间节点 m m m再到 v v v的一条路径即可。可以证明和原来的流网络等价。
对于多源节点和汇点,我们可以构建超级源节点s和超级汇点t。超级源节点s指向所有的源节点,并且容量都是无穷大;汇点都指向超级汇点t,并且容量都是无穷大。可以证明和原来的流网络等价。
最大流
最大流问题即,给定一个流网络,求一个流 f f f,使得 ∣ f ∣ |f| ∣f∣的值最大,这个问题被称为最大流。最大流一般的解法通常是Ford-Fulkerson方法。
Ford-Fulkerson方法
Ford-Fulkerson方法循环增加流的值。在每一次迭代中,都会增加一些边的流,方法就是在关联的残存网络 G f G_{f} Gf中寻找一条增广路径,从而增大增广路径上的流量。对于一条边来说,流量可能增加也可能减少。重复对流的这一过程,直到残存网络中不存在增广路径为止,此时的流就是最大流。
残存网络
假定有流网络 G = ( V , E ) G=(V,E) G=(V,E),其源节点为s,汇点为t。设 f f f为图G的一个流,考虑节点对 u , v ∈ V u,v \in V u,v∈V,定义残存容量 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 O t h e r w i s e c_{f}(u,v) = \left\{\begin{matrix} c(u,v) - f(u,v) & (u,v) \in E & \\ f(v,u) & (v,u) \in E & \\ 0 & Otherwise & \\ \end{matrix}\right. cf(u,v)=⎩⎨⎧c(u,v)−f(u,v)f(v,u)0(u,v)∈E(v,u)∈EOtherwise
因为流网络不允许存在平行边,因此上面的三种情况只能有一种成立。而残存网络中允许存在反向边,残存网络中这些反向边允许算法将已经发送的流量再发送回来。而将流量从同一条边发送回去等同于缩减该条边的流量。
给定一个流网络 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 = { ( u , v ) ∈ V × V : c f ( u , v ) > 0 } E_{f} = \{ (u,v) \in V \times V : c_{f}(u,v) \gt 0\} Ef={(u,v)∈V×V:cf(u,v)>0}。
也就是说,残存网络的每条边或者残存边,必须允许大于0的流量通过。并且 E f E_{f} Ef要么是原来流网络的边,要么是其反向边。因此, ∣ E f ∣ ≤ 2 ∣ E ∣ |E_{f}| \leq 2|E| ∣Ef∣≤2∣E∣。
注意,残存网络 G f G_{f} Gf类似于一个容量为 c f c_{f} cf的流网络,但是它并不满足流网络的定义,其可能存在反向边。除了这个差别以外,其余均与流网络一样,因此,我们也可以在残存网络中定义一个流,他满足流的定义,但是是针对容量 c f c_{f} cf来说。
残存网络的一个流为我们指明了路线,定义我们如何在原图上增加流。
如果 f f f为原流网络 G G G的一个流, f ′ f' f′为对应残存网络 G f G_{f} Gf的一个流,定义流 f ↑ f ′ f \uparrow f' f↑f′为流 f ′ f' f′对流 f f f的递增,其定义如下:
f ↑ f ′ ( u , v ) = { f ( u , v ) + f ′ ( u , v ) − f ′ ( v , u ) ( u , v ) ∈ E 0 O t h e r w i s e f \uparrow f'(u,v) = \left\{\begin{matrix} f(u,v) + f'(u,v) - f'(v,u) & (u,v) \in E & \\ 0 & Otherwise & \\ \end{matrix}\right. f↑f′(u,v)={f(u,v)+f′(u,v)−f′(v,u)0(u,v)∈EOtherwise
因为我们在残存网络中将流量发送到反向边上等同于在原来的边上缩减流量,因此应该是原来的流量加上发送出去的流量减去发送回来的流量。将流量发送回去也称为抵消操作。
下面几个定理说明了流 f ↑ f ′ f \uparrow f' f↑f′的性质。
定理:流 f ↑ f ′ f \uparrow f' f↑f′是仍然是图 G G G的一个流,满足流的两个限制条件。
定理:流 f ↑ f ′ f \uparrow f' f↑f′的值 ∣ f ↑ f ′ ∣ = ∣ f ∣ + ∣ f ′ ∣ |f \uparrow f'| = |f| + |f'| ∣f↑f′∣=∣f∣+∣f′∣。
证明部分略,请参照《算法导论》。
增广路径
给定一个残存网络 G f G_{f} Gf,增广路径p是指在残存网络中的一条 s → t s \to t s→t的一条简单路径,其中 s s s为源节点 t t t为汇点。根据残存网络的定义,我们在某一条增广路径p中选择一条边 ( u , v ) ∈ p (u,v) \in p (u,v)∈p,此时我们能增加这条边的流量到 c f ( u , v ) c_{f}(u,v) cf(u,v)而保证流网络的限制。
我们称将一条增广路径p上的每一条边都增加相同的流量的最大值为p的残存容量。定义残存容量:
c f ( p ) = min ( c f ( u , v ) : ( u , v ) ∈ p ) c_{f}(p) = \min(c_{f}(u,v) : (u,v) \in p) cf(p)=min(cf(u,v):(u,v)∈p)
定理:设p为一条增广路径。定义一个流 f p f_{p} fp为:
f p = { c f ( p ) ( u , v ) ∈ p 0 O t h e r w i s e f_{p} = \left\{\begin{matrix} c_{f}(p) & (u,v) \in p & \\ 0 & Otherwise & \\ \end{matrix}\right. fp={cf(p)0(u,v)∈pOtherwise
则流 f p f_{p} fp是残存网络 G f G_{f} Gf中的流,并且 ∣ f p ∣ = c f ( p ) > 0 |f_{p}| = c_{f}(p) > 0 ∣fp∣=cf(p)>0。
推论:流 f ↑ f p f \uparrow f_{p} f↑fp仍然是G的一个流,并且 ∣ f ↑ f p ∣ = ∣ f ∣ + ∣ f p ∣ > ∣ f ∣ |f \uparrow f_{p}| =|f| + |f_{p}| \gt |f| ∣f↑fp∣=∣f∣+∣fp∣>∣f∣。
流网络的切割
Ford-Fulkerson方法的核心就是不断寻找增广路径p,增加增广路径所对应的流 f p f_{p} fp。我们先来探讨一下流网络的切割。
流网络 G G G的一个切割 ( S , T ) (S,T) (S,T)将节点集合 V V V分为两个部分,一个是 S S S和 T = V − S T=V-S T=V−S两个集合,并且使得 s ∈ S , t ∈ T s \in S,t \in T s∈S,t∈T。定义横跨切割的净流量 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 ) 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(S,T)=u∈S∑v∈T∑f(u,v)−u∈S∑v∈T∑f(v,u)
切割 ( S , T ) (S,T) (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)
最小切割问题指的是在一个流网络中,找到一个切割 ( S , T ) (S,T) (S,T),使其容量最小。
定理(净流量守恒定理):对于任意一个切割 ( S , T ) (S,T) (S,T),都有 f ( S , T ) = ∣ f ∣ ≤ c ( S , T ) f(S,T) = |f| \leq c(S,T) f(S,T)=∣f∣≤c(S,T)。
可以这么理解,将S集合看成一个超级源节点,T集合看成超级汇点,因此图中只剩下两个节点(超级源节点和超级汇点),因此一个切割的净流量等于 ∣ f ∣ |f| ∣f∣,并且小于该切割的容量。
推论:任何一个流 f f f,的流量值 ∣ f ∣ |f| ∣f∣都不能超过任意切割的容量。
因此,我们给出最重要的定理,连接了最大流问题和最小割问题:
定理(最大流最小切割定理):设 f f f为 G = ( V , E ) G=(V,E) G=(V,E)的一个流,该流网络的源节点为s,汇点为t,则下面的条件是等价的:
- f f f是G的一个最大流
- 残存网络 G f G_{f} Gf中不存在增广路径。
- ∣ f ∣ = c ( S , T ) |f|=c(S,T) ∣f∣=c(S,T),即 ∣ f ∣ |f| ∣f∣是最小切割的容量值。
证明参考《算法导论》。
总结
流网络初步的一些基本概念就介绍到这里,随后我会介绍Ford-Fulkerson方法的两个实现算法——基本Ford-Fulkerson算法和Edmonds-Karp算法。