课程链接:
一、流网络
流量/容量都表示在边上,有源点和汇点
几个概念:剩余流量、总流量、流量限制(条件)、流量守恒(条件)
二、最大流问题描述
在满足约束条件的情况下,让总流量最大。
三、最大流算法思想
直观的描述算法(需要改进):
A:找出一条路径,这条路径点不重复,并且找出剩余流量的最小值作为这条路径的流量。
迭代寻找路径,重复步骤A,增加总流量:
直到最后,我们再也找不到可以增加总流量的路径结束。
但是,发现这种策略不一定能找到最大流。
发现我们的直观策略,如果在某个路径上 +1 的话是无法增加总流量的,但是减小某些路径的流量,将流量大小进行再分配之后发现是可以增加总流量的。
于是,我们思考怎么调整直观的策略。。。。
因为缩减边上的流量可以进一步增大总流量,因此引入反向边代表缩减的边流量。
这种反向边的边权如何定义?
为了保证流量调整的合理性, 我们可以由原始边产生一组残存边:
我们定义残存网络(也叫余图)
在残存网络(余图)中寻找增广路径。
最终形成了Ford-Fulkerson算法(FFA)思想
总结:我们算法改进的历程(从直观算法到Ford-Fulkerson算法)
四、示例分析
初始时刻的流网络展示:
将流网络改造成残存网络(也就是他的余图):
需要注意的是,其实每个路径都有正向边和反向边,只不过为0的就省去了
寻找这个残存网络的增广路径:
于是在增加了这条增广路径之后,我们得到了新的流网络:
根据这个新的流网络得到新的残存网络:
找到了新的残存网络之中的增广路径:
得到新的流网络:
基于新的流网络更新残存网络:
发现新的增广路径:
更新流网络:
重复以上的三步循环。。。。
最终当无法发现新的增广路径的时候,算法可以终止。
四、分析FFA
时间复杂度:O(mC)
其中C为最大流的值,m为边数
DFS查找增广路径P ,每次的DFS的时间复杂度就是O(边数)
运行时间依赖于增广过程:
五、如何证明FFA可以获得最优解
FFA的正确性证明
充分性:
必要性:
直接证明比较困难:
证明需要借助中间问题证明
我们引入“割”的概念:将最大流问题转化为最小割问题
给出割的容量的概念:
注意在计算割的容量的时候,我们考虑的是容量而不是流量
下面给出割与流的关系的定理:流值定理
流值:注意是出去和进入的路径的流量的差值
S的流出也就是最大流 =
话说回来:
最小割找的是什么?
瓶颈总容量也就是这个分割流出的容量也就是这个割的容量是最小的,想要让输送的更多,卡脖子的地方就是在这个 割 的地方。
于是又根据流值定理,我们得到最大流的流值小于等于最小割的容量。
回到我们的必要性证明
从而