割(Cut)
s-t cut:(A, B),将图分为两部分A和B,源s∈A,终点t∈B
cut(A, B)的容量(capacity):所有流出A的边的容量和,注意区分与流量(flow)的区别。
如下图
最小的s-t cut:具有最小的容量(capacity)。
割实际就是,彻底切断s与t的通信,需去掉的边的容量之和。用最小的劳动力斩断通信,即最小割。
流
对任意流,均满足条件:
- ∀ e∈E,有f(e)≤c(e). 经过任意边的流量不大于该边的容量。(通过水管的水量不超过水管的负载能力)
- ∀ v∈V - {s, t},. 任意点流出的流量与流入这点的流量相等——流一致性。(每个水管节点不消耗也不凭空产生水)
流大小的定义
对流f,其大小为流出该点(部分)流量之和与流入的流量之差。
最大流问题
两个重要结论:
- 对任意流f,任意割(A, B),流的大小为流出A的流量与流入A的流量之差。例如,自来水中转站一共能向外供应的水量。
- 任意流的大小不大于割的大小。v(f)≤cap(A, B). 例如,从我家到你家的自来水管的流量为520,若你惹我生气了,我想切断从我家到你家的自来水供应。因此,我需要花费不低于520的劳动力(割)。可见,流量能达到的最大值就是割的大小。
最大流与最小割
推论 若流大小与割大小相等,那么这一定是最大流。(前面的重要结论可以帮助理解)
如何寻找最大流?很容易想到的是贪心算法。
贪心算法求解最大流
思路:从流量为0的边开始,选取s到t的路径(需满足流量不大于容量)并修改流量,不停添加增广路径,直到没有为止,然后再从流量为0的边开始重复操作。
贪心算法得出最大流16
实际最大流为19
贪心算法一旦提升了流量,就不再减小,没有回溯不佳的路径选择。
Ford Fulkerson算法
增广路径:剩余图中,s到t的简单路径。
瓶颈容量:一条增广路径的流量贡献,取决于这条路径上所有边的最小剩余容量.
区别于贪心算法,我们每次在剩余图中寻找s-t的简单路径。
剩余图的画法
举例,下图用贪心算法计算出最大流为20。
贪心算法得出的错误结果
使用Ford Folkerson算法,每次更迭画出剩余图,剩余图的相反路径可用于回溯。
FF算法求出最大流为30
Q
无向图如何构造剩余图,如何求解最大流?
网友评论