算法课 - 最大流问题

课程链接:

算法设计与分析-最大流https://www.icourse163.org/learn/BUAA-1449777166?tid=1465293450#/learn/content?type=detail&id=1244171114

一、流网络

流量/容量都表示在边上,有源点和汇点

几个概念:剩余流量、总流量、流量限制(条件)、流量守恒(条件)

 算法课 - 最大流问题_第1张图片

二、最大流问题描述

算法课 - 最大流问题_第2张图片 在满足约束条件的情况下,让总流量最大。

三、最大流算法思想

直观的描述算法(需要改进):

A:找出一条路径,这条路径点不重复,并且找出剩余流量的最小值作为这条路径的流量。

算法课 - 最大流问题_第3张图片 迭代寻找路径,重复步骤A,增加总流量:

算法课 - 最大流问题_第4张图片 直到最后,我们再也找不到可以增加总流量的路径结束。

 但是,发现这种策略不一定能找到最大流。

发现我们的直观策略,如果在某个路径上 +1 的话是无法增加总流量的,但是减小某些路径的流量,将流量大小进行再分配之后发现是可以增加总流量的。

算法课 - 最大流问题_第5张图片

于是,我们思考怎么调整直观的策略。。。。

因为缩减边上的流量可以进一步增大总流量,因此引入反向边代表缩减的边流量。

这种反向边的边权如何定义?

为了保证流量调整的合理性, 我们可以由原始边产生一组残存边:

算法课 - 最大流问题_第6张图片

 我们定义残存网络(也叫余图)

算法课 - 最大流问题_第7张图片

 在残存网络(余图)中寻找增广路径。

最终形成了Ford-Fulkerson算法(FFA)思想

算法课 - 最大流问题_第8张图片

总结:我们算法改进的历程(从直观算法到Ford-Fulkerson算法)

算法课 - 最大流问题_第9张图片

四、示例分析

初始时刻的流网络展示:

算法课 - 最大流问题_第10张图片

 将流网络改造成残存网络(也就是他的余图):

算法课 - 最大流问题_第11张图片

需要注意的是,其实每个路径都有正向边和反向边,只不过为0的就省去了

寻找这个残存网络的增广路径:算法课 - 最大流问题_第12张图片

于是在增加了这条增广路径之后,我们得到了新的流网络:

算法课 - 最大流问题_第13张图片

根据这个新的流网络得到新的残存网络:

算法课 - 最大流问题_第14张图片 找到了新的残存网络之中的增广路径:

算法课 - 最大流问题_第15张图片 得到新的流网络:

算法课 - 最大流问题_第16张图片 基于新的流网络更新残存网络:

算法课 - 最大流问题_第17张图片 发现新的增广路径:

算法课 - 最大流问题_第18张图片更新流网络:

算法课 - 最大流问题_第19张图片 重复以上的三步循环。。。。

算法课 - 最大流问题_第20张图片

最终当无法发现新的增广路径的时候,算法可以终止。 

四、分析FFA

算法课 - 最大流问题_第21张图片

时间复杂度:O(mC)
其中C为最大流的值,m为边数

算法课 - 最大流问题_第22张图片

DFS查找增广路径P ,每次的DFS的时间复杂度就是O(边数)

运行时间依赖于增广过程:

算法课 - 最大流问题_第23张图片

算法课 - 最大流问题_第24张图片

五、如何证明FFA可以获得最优解

FFA的正确性证明
 算法课 - 最大流问题_第25张图片

 充分性:
算法课 - 最大流问题_第26张图片

必要性:
直接证明比较困难:
证明需要借助中间问题证明

算法课 - 最大流问题_第27张图片

我们引入割”的概念:将最大流问题转化为最小割问题 

算法课 - 最大流问题_第28张图片

给出割的容量的概念:

算法课 - 最大流问题_第29张图片

注意在计算割的容量的时候,我们考虑的是容量而不是流量

下面给出割与流的关系的定理:流值定理
流值:注意是出去和进入的路径的流量的差值

算法课 - 最大流问题_第30张图片

S的流出也就是最大流 = 算法课 - 最大流问题_第31张图片 

话说回来:

最小割找的是什么?

算法课 - 最大流问题_第32张图片

瓶颈总容量也就是这个分割流出的容量也就是这个割的容量是最小的,想要让输送的更多,卡脖子的地方就是在这个 割 的地方。

于是又根据流值定理,我们得到最大流的流值小于等于最小割的容量。

回到我们的必要性证明

算法课 - 最大流问题_第33张图片

 从而

算法课 - 最大流问题_第34张图片

算法课 - 最大流问题_第35张图片

你可能感兴趣的:(算法,算法)