网络流II:Capacity-scaling 算法
算法 网络流
这是网络流的第二部分。在网络流 I 中我们讨论了最大流最小割的定义、求解方法以及定理证明。在第二部分中,我们将讨论一种优化 Ford-Fulkerson 算法时间复杂度的方法——Capacity-scaling 算法。Capacity-scaling 算法通过不断搜寻残存网络子图中瓶颈容量最大的增广路径,将算法时间复杂度从 优化到 。
Ford-Fulkerson 算法缺陷
回顾 Ford-Fulkerson 算法
我们这里再次写一下 FF 算法的流程:
- 初始化:对于网络 上所有边 ,令 。
- 在残存网络 中任意寻找一条增广路径 。
- 在路径 上添加流。
- 重复直到找不到增广路径。
首先,我们来分析一下为什么需要 Capacity-scaling 算法,直接用 Ford-Fulkerson 算法的缺陷是什么?
Ford-Fulkerson 算法分析
**假设:**网络中边的容量均为 到 之间的整数。
整数不变性(Integrality invariant):通过 Ford-Fulkerson 算法,网络中流的值 以及残存容量 同样是整数。
**定理:**算法最多在 次迭代后终止。
- 证明:Ford-Fulkerson 算法每一次迭代至少给流的值增加1,且根据定义,流的值上限为 。
**推论:**Ford-Fulkerson 算法的时间复杂度是 。
整数定理(Integrality theorem):存在一个最大流 ,它的所有边的流值 均为整数。
- 证明:因为 Ford-Fulkerson 算法会终止,由 Integrality invariant 可以直接推得。
Ford-Fulkerson 算法的 Bad case
我们可以发现,Ford-Fulkerson 算法的时间复杂度不仅基于输入规模 的多项式时间,还与网络最大容量 有关。如果网络的最大容量为 ,那么算法一定会进行 次迭代。因此,即便输入规模很小,如果输入网络边的最大容量 很大,那么 FF 算法的时间复杂度依然会很大。
选择好的增广路径
避免这个问题的方法就是在算法过程中选择更好的增广路径。那么我们该如何高效地找到增广路径并且使 FF 算法的迭代更少呢?
记得在上一节我们将瓶颈容量的时候提到,如果 是原来的流,且找到一条增广路径 ,那么更新的流 满足 。所以如果能够每次挑选瓶颈容量最大的增广路径,我们就可以保证每次迭代中 增加的量最大,从而减少迭代次数。
直接搜索瓶颈容量最大的路径计算量较大,因此我们采用 Capacity-scaling 算法进行寻找。
Capacity-scaling 算法
在 Capacity-Scaling 算法中,我们记录一个缩放参数 ,在每次迭代中,我们不关注整个 ,只关注 。 是 的子图,只包括 中残存容量 的边。我们初始化 为不大于最大容量 的最大2次幂,且在每轮迭代中缩小 为 。
算法伪代码
算法正确性与复杂性分析
假设:所有边的容量是 到 的整数。
**整数不变性:**所有流和残存容量都是整数。
定理:如果 Capacity-scaling 算法终止,那么 是一个最大流。
证明:
- 根据整数不变性,当 时,。
- 根据伪代码,算法在 阶段终止时,图上将不再有增广路径。
引理1:外层 While 循环重复 次。
证明:算法初始化 ,且 每次迭代减少 ,由此可得结果。
引理2:令 是某个 -scaling 阶段后的流,则最大流的值 ( 为边数)。
证明:(类比最大流最小割 的证明方法)
-
假设存在割 满足 。
-
为源点 在 中可达的所有点的集合。
-
根据割 的定义,。
-
根据流 的定义,因为是迭代后的结果,所以一定没有增广路径,所以 。
-
由上述条件可得(证明类比最大流最小割定理 ,在残存网络中用反证法):
- 对于任意边 , 且 ,有 。
- 对于任意边 , 且 ,有 。
引理3:流的值在每个 Scaling 阶段最多增加 次。
证明:
- 令 是上个阶段(-)得到的流。
- 令 是当前阶段(-)得到的流,其中 。
- 根据引理2,可得 。
- 也就是说,。
- 所以说,在 - 阶段,流的值最多增加 。
- 根据算法,在 - 阶段,每次流值的增量至少为 。
- 所以,流值最多的增加次数为 。
定理:Capacity-scaling 算法需要在 次增加中找到最大流,每一次增加所需要的时间为 ,包括建立网络以及寻找路径。因此 Capacity-scaling 算法总体时间复杂度为 。
证明:由引理1和引理3可得。
又学会了一个算法,激不激动233。