网络流
目录
二分匹配——网络流的特例
一般性的问题——最大流问题
一、最大流问题与Ford-Fulkerson算法
1.问题
交通网络。
要素:边的容量,源点,汇点(终点)
流网络:
是具有以下特征的有向图
- 每条边e管理一个容量
- 存在单一源点
- 存在单一汇点
定义流:
一个流f必须满足以下两个性质:
- (容量条件)对每个,我们有 .
- (守恒条件)除了s与t之外,对每个结点v,我们有进入结点v的所有边上的总流值等于离开结点v的所有边上的总流值
最大流问题:
给定一个流网络,找出一个具有最大值的流。
(将证明最大流值等于称之为最小割的任何这种划分的最小容量)
2.设计算法
剩余图:
我们如下定义G关于f的剩余图 :
- 的结点集与的结点集相同
- 对的每条边,其中 ,那么存在 的剩余的容量单位,在这个容量上向前推进,得到一条边 ,容量为,我们把这种形式的边叫做前向边。
- 对的每条边,其中 ,那么在上面还存在 单位的流,我们只要想做,就可以通过向后推这个流来“撤销”它,因此我们在中的到一条边,其中容量为。我们把这种形式的边叫做后向边。
在剩余图中的增广路径:
augment(f,P)
令
For 每条边
If 是一条前向边 then
在G中把增加b
Else 是一条后向边,且令
在G中把减少b
Endif
Endfor
Return
为反映增广的重要性,人民常把在剩余图中的任何一条 路径认为是一条增广路径。
命题7.1 是中的一个流。
计算G中一个 流的算法:
Max-Flow
对G中所有的e初始化
While 在增广图 中存在一条 路径
令 P 是 中的一条简单路径
把 更新为
把增广图 更新为
Endwhile
Return
3.分析算法:终止与运行时间
命题7.2 在Ford-Fulkerson算法的每个中间步,流值和中的剩余容量是整数。
命题7.3 令 是G中的流,且令P是中的一条简单的路径.那么,,并且由于,我们有.
定理7.4 假设在流网络G中的所有容量都是整数,那么Ford-Fulkerson算法在至多C次While循环的迭代后终止。
定理7.5 假设在流网络G中的所有容量都是整数,那么Ford-Fulkerson算法的运行可以在时间内实现。
二、网络中的最大流与最小割
1.分析算法:流与割
割:割是结点集合V的一个划分,使得
定理7.6 令是任何流,且 是任意割,那么 .
命题7.7 令是任何流,且 是任意割,那么 .
定理7.8 令是任何流,且 是任意割,那么 .
2.分析算法:最大流等于最小割
定理7.9 如果是使得在剩余图中没有路径的一个流,那么在G中存在一个割使得,因此,有G中任何流的最大值,且有G中任何割的最小容量。
定理7.10 有Ford-Fulkerson算法返回的流是最大流
定理7.11 给定一个最大值的流,我们可以在时间内计算一个最小容量的割
命题7.12 在每个流网络中,存在一个流和一个割使得
定理7.13 在每个流网络中,一个流的最大值等于一个割的最小容量
3.进一步分析:整数值的流
定理7.14 如果在流网络中所有的容量都是整数,那么存在一个最大流,它的每个流值都是整数。
三、选择好的增广路径
1.设计一个更快的流算法
缩放参数
Scaling Max-Flow
对G中所有的e初始化
初始化置