算法设计与分析课程复习笔记13——最大网络流
最大网络流
问题
- 公路物流。边:公路,顶点:城市
- 管道流体。边:管道,顶点:管道接头
- 数据通讯网络。边:网络线,顶点:路由器
概念:源点s,汇点t,除源点和汇点外, 其他顶点的流入和流出相等
目标:从源点到汇点的最大流量
正式描述:
网络流图G=(V,E)
边的容量c(u,v)
0
特殊顶点:源点s,汇点t
在源点和汇点之间,有经过一些中间顶点v的通路s→……→v→……→t
流函数:
容量约束,f(u,v)
c(u,v)
斜对称,f(u,v)=-f(v,u)
流守恒,
或
流的抵消
在两个顶点间不需要相向对流,因为可以抵消,而斜对称性只是为了符号方便性。
最大流问题
Ford-Fulkerson方法
思想:不断地增大流,直到达到流的最大值
通过剩余流和剩余流图实现
剩余流:
f=c(u,v)-f(u,v)
剩余流图:
,
(|
|
2|E|:因为在剩余网络流图
中的边要么在E中, 要么反向)
增流通路
- 增流通路p是剩余图中从源点s到汇点t的一条通路
- 通过增流通路p,可以提高网络中的流, 即存在a > 0, 对于p上的边(u,v), 有f(u,v) + a 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. 剩余流图
中不再有增流通路
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
do
← min{
:(u,v) is in p}
for each edge (u,v) in p
do f[u,v] ← f[u,v] +
f[v,u] ← -f[u,v]
example:
分析:
- 如果容量为整数,|f|每次增流 1
- 如果最大流为f*,那么增流次数 |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
5 do
← min{
:(u,v) is in p}
6 for each edge (u,v) in p
7 do f[u,v] ← f[u,v] +
8 f[v,u] ← -f[u,v]
E-K算法在FF算法的基础上进行修改,在剩余图中用广度优先搜索来计算第4行
增流通路p是剩余图中从s到t的最短路通路
运行开销:
(因为增流通路
)
更多的改进算法
- Push-relabel algorithm
- The relabel-to-front algorithm
- The scaling Max-Flow algorithm ,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的最大匹配
参考:任课教师邱德红教授的课件