chap26 最大流 流网络
Ford-Fulkerson方法
最大二分匹配
算法导论
内容
流网络
流网络:
, directed.
Each edge ; has a capacity
If , then
If , then reverse edge . (Can work around this restriction.
Source vertex , sink vertex , assume for all , so that each vertex lies on a path from source to sink and
流:
可以通过增加中间结点的方式将不能有反平行边的限制去除,
对于具有对个源结点和汇点的情况,可以加入一个超级源结点和超级汇点来转化成单个源结点和汇点的问题,这两个加入的点的容量都是无穷大
Ford-Fulkerson方法
Ford-Fulkerson方法依赖于残存网络、增广路径和切割这三个重要思想,其正确性由最大流最小切割定理保证
残存网络 : 可以看成是去除了反向边限制的流网络,由流网络 和流 生成
残存容量:
残存网络的流 ,定义: ,可以证明 是原流网络的一个流,其值为
增广路径:增广路径 是残存网络中一条从源结点 到汇点 的简单路径
p的残存容量:
残存网络的一个流 定义为:
是 的一个流
流网络的切割:切割 ,
净流量:
容量:
由于流量守恒,必然导致:1.所有切割的净流量都等于 ;2.最大流的值不会超过最小切割的容量
最大流最小切割定理:以下条件等价:
1. 是 的一个最大流
2.残存网络 不包括任何增广路径
3. ,其中 是流网络 的某个切割
基本的Ford-Fulkerson算法 ford-fulkerson(G,s,t)
for each edge(u,v) in G.E
(u,v).f = 0
while there exists a path p from s to t in the residual network G_f
c_f(p) = min{...}
for each edge(u,v) in p
if (u,v) in E
(u,v).f += c_f(p)
else
(v,u).f -= c_f(p)
假定所选择的任意增广路径和所有的容量都是整数,如果容量为有理数,可以乘上某个系数转化成整数
若f是某个最大流,则while循环最多|f|次(对应每次流只增加1)
用有向图来表示残差网络,使用广度或者深度有限搜索,在此图中找到一条增广路径的时间是 ,(注意到 ),因而总时间为 ,适用于流较小的情况
Edmonds-Karp算法
对增广路径的选择不再任意,而是选择一条从源结点s到汇点t的最短路径,这可以通过广度优先搜索来实现
时间为
,其中找最短路径 ,流递增操作共执行 次
最大二分匹配
匹配: 给定一个无向图 ,一个匹配是边的一个子集 ,使得对于所有的结点 ,子集 中最多有一条边与之相连。
最大匹配即含有最多边的匹配
二分图: 即结点集合可以划分成 ,其中L和R不相交,并且边集合中所有边都横跨L和R。进一步假定集合中的每个结点都至少有一条边(方便转化成最大流问题)
实际应用,将L看成是机器集合,R是任务集合,E中有边(u,v)则表示机器u能够处理任务v。最大匹配能够让尽可能多的机器运转起来
寻找最大二分匹配的做法就是将二分图 转化成流网络 ,具体做法就是将L看成源结点集合,R看成是汇点集合,因而首先加上一个超级源结点s和超级汇点t以及这两者对应的边,原图中所有无向边的方向都定义成从L指向R,最后给流网络中所有边都赋予单位容量
引理26.9:给定二分图 和对应的流网络 ,若 中存在一个匹配 ,则 中存在一个整数值的流 使得 ,反之亦成立。并且满足 的边都是M中的边
完整性定理26.10: 如果容量函数c只能去整数值,则Ford-Fulkerson方法所生成的最大流f满足|f|是整数值的性质,而且对于所有的结点u和v,f(u,v)的值都是整数
推论26.11 二分图G中的一个最大匹配的基数等于其对应的流网络 中某一最大流f的值
总结就是,两者完全等价: ,并且
习题
to be continued
代码实现