算法设计与分析课程复习笔记13——最大网络流
最大网络流
问题
- 公路物流。边:公路,顶点:城市
- 管道流体。边:管道,顶点:管道接头
- 数据通讯网络。边:网络线,顶点:路由器
概念:源点s,汇点t,除源点和汇点外, 其他顶点的流入和流出相等
目标:从源点到汇点的最大流量
正式描述:
网络流图G=(V,E)
边的容量c(u,v)
≥
\geq
≥ 0
特殊顶点:源点s,汇点t
在源点和汇点之间,有经过一些中间顶点v的通路s→……→v→……→t
流函数:
容量约束,f(u,v)
≤
\leq
≤ c(u,v)
斜对称,f(u,v)=-f(v,u)
流守恒,
∑
v
∈
V
f
(
u
,
v
)
=
f
(
u
,
V
)
=
0
\displaystyle \sum_{v∈V}f(u,v)=f(u,V)=0
v∈V∑f(u,v)=f(u,V)=0或
∑
v
∈
V
f
(
v
,
u
)
=
f
(
V
,
u
)
=
0
\displaystyle \sum_{v∈V}f(v,u)=f(V,u)=0
v∈V∑f(v,u)=f(V,u)=0
流的抵消
在两个顶点间不需要相向对流,因为可以抵消,而斜对称性只是为了符号方便性。
最大流问题
∣ f ∣ = ∑ v ∈ V f ( s , v ) = f ( s , V ) = f ( V , t ) |f|=\displaystyle \sum_{v∈V}f(s,v)=f(s,V)=f(V,t) ∣f∣=v∈V∑f(s,v)=f(s,V)=f(V,t)
Ford-Fulkerson方法
思想:不断地增大流,直到达到流的最大值
通过剩余流和剩余流图实现
剩余流:
c
f
(
u
,
v
)
c_f(u,v)
cf(u,v)f=c(u,v)-f(u,v)
剩余流图:
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) ∈ V*V: c_f(u,v) > 0}
Ef=(u,v)∈V∗V:cf(u,v)>0
(|
E
f
E_f
Ef|
≤
\leq
≤ 2|E|:因为在剩余网络流图
E
f
E_f
Ef中的边要么在E中, 要么反向)
增流通路
- 增流通路p是剩余图中从源点s到汇点t的一条通路
- 通过增流通路p,可以提高网络中的流, 即存在a > 0, 对于p上的边(u,v), 有f(u,v) + a ≤ \leq ≤ c(u,v)
Ford-Fulkerson(G,s,t)
initialize flow f to 0
while there exists an augmenting path p
do augment flow f along p
return f
不再有增流通路时,达到最大流
切割
一个切割将V分割成S,和T=V-S,使得s ∈ S,t ∈ T
流经切割的网络流f(S,T)是所有边(u,v), u ∈ S,v ∈ T的流f(u,v)之和
切割的网络流容量c(S,T)是所有边(u,v), u ∈ S, v ∈ T的流容量c(u,v)之和
引理:对于任何切割(S,T)和流f, 有f(S,T)=|f|
推论:网络流图G中的任意流f以任何切割的流容量为上限
最大流最小切割定理
对于网络流图
G=(V,E), s是源点, t是汇点, f是G中的流, 下面三个语句是等价的:
1. f是G中的最大流
2. 剩余流图
G
f
G_f
Gf中不再有增流通路
3. 存在一个切割(S,T), |f| = c(S,T)
基本FordFulkerson算法
FordFulkerson(G,s,t)
for each edge (u,v) ∈ E(G)
do f[u,v] ← 0
f[v,u] ← 0
while there exists a path p from s to t in the residual network
G
f
G_f
Gf
do
c
f
(
p
)
c_f(p)
cf(p) ← min{
c
f
(
u
,
v
)
c_f(u,v)
cf(u,v):(u,v) is in p}
for each edge (u,v) in p
do f[u,v] ← f[u,v] +
c
f
(
p
)
c_f(p)
cf(p)
f[v,u] ← -f[u,v]
example:
分析:
- 如果容量为整数,|f|每次增流 ≥ \geq ≥ 1
- 如果最大流为f*,那么增流次数 ≤ \leq ≤|f*|,时间开销 O ( E ∣ f ∗ ∣ ) O(E|f*|) O(E∣f∗∣)
- 时间开销不是输入规模的多项式, 与|f*|有关, 不是|V|或|E|的函数
- 如果容量是有理数, 可以换算为整数
- 如果是无理数, 有可能不会终止
缺陷:如果出现以下情况,则需要重复999999次
E-K算法
先回顾FordFulkerson算法:
FordFulkerson(G,s,t)
1 for each edge (u,v) ∈ E(G)
2 do f[u,v] ← 0
3 f[v,u] ← 0
4 while there exists a path p from s to t in the residual network
G
f
G_f
Gf
5 do
c
f
(
p
)
c_f(p)
cf(p) ← min{
c
f
(
u
,
v
)
c_f(u,v)
cf(u,v):(u,v) is in p}
6 for each edge (u,v) in p
7 do f[u,v] ← f[u,v] +
c
f
(
p
)
c_f(p)
cf(p)
8 f[v,u] ← -f[u,v]
E-K算法在FF算法的基础上进行修改,在剩余图中用广度优先搜索来计算第4行
增流通路p是剩余图中从s到t的最短路通路
运行开销:
O
(
V
E
2
)
O(VE^2)
O(VE2)(因为增流通路
O
(
V
E
)
O(VE)
O(VE))
更多的改进算法
- Push-relabel algorithm O ( V 2 E ) O(V^2E) O(V2E)
- The relabel-to-front algorithm O ( V 3 ) O(V^3) O(V3)
- The scaling Max-Flow algorithm O ( E 2 l o g C ) O(E^2logC) O(E2logC),C为最大整数容量
最大二分图匹配
二分图G=(V,E)
V分成L和R,E中任意边的顶点分别在L和R中
匹配是E的一个子集M,对于V中的任何顶点v,M中至多有一条边以它为顶点
最大匹配即具有最大的势的匹配
最大匹配求解
- 转换为最大流问题
- 用F-F方法求解
从二分图G生成相应的网络流图G‘
- 增添源点s和从s到L的边
- 保持原来的E
- 增添汇点t和从R到t的边
- 边的容量为1
G’的最大流对应G的最大匹配
参考:任课教师邱德红教授的课件