网络流III:Edmonds-Karp 算法

网络流III:Edmonds-Karp 算法


算法 网络流

上一章提到,Ford-Fulkerson 算法效率的突破点就在于寻找更好的增广路径。上一章中提到的 Capacity-scaling 算法选择的是瓶颈容量最大的增广路径。这一章中,我们将选择边数最小的增广路径。基于这种选择的 Ford-Fulkerson 算法称为 Edmonds-Karp 算法。

Edmonds-Karp 算法就是在 Ford-Fulkerson 方法的基础上,将每条边上权重视为1的情况下,寻找最短增广路径,也就是边数最少的路径。我们可以很自然地想到利用广度优先搜索(BFS)的方法来寻找边数最小的增广路径,算法伪代码如下:

bfs

算法分析

引理:如果 Edmonds-Karp 算法运行在流网络 G=(V,E)G=(V,E) 上,该网络的源点为 ss,汇点为 tt。则对于所有结点 vV{s,t}v\in V-\{s,t\},残存网络 GfG_f 中从结点 uu 到结点 vv 的最短路径距离(边权均为1δf(u,v)\delta_f(u,v) 随着每次流量的递增而单调递增

证明(反证法)

  • 假设对于结点 vv,存在一个流量递增操作,导致从源点 ss 到结点 vv 的最短路径距离减少。

  • ff 为第一个这样的流量操作之前的流量,ff' 是该操作之后的流量。

  • vv 是所有流量递增操作下最短路径被减少的结点中,δf(s,v)\delta_{f'}(s,v) 最小的结点,可得 δf(s,v)<δf(s,v)\delta_{f'}(s,v)<\delta_{f}(s,v)

  • p=s(u,v)p=s\to (u,v) 是残存网络 GfG_{f'} 中从源点 ss 到结点 vv 的一条最短路径,因此,(u,v)Ef(u,v)\in E_{f'},且

    δf(s,u)=δf(s,v)1\delta_{f'}(s,u)=\delta_{f'}(s,v)-1
  • 因为无论如何选择结点 vv,我们知道从源点 ss 到结点 uu 的距离并没有减少(因为 svs\to v 是减少的路径中最短的一条),即

    δf(s,u)δf(s,u)\delta_{f'}(s,u)\geq \delta_{f}(s,u)
  • 我们断言 (u,v)Ef(u,v)\notin E_f。因为如果有 (u,v)Ef(u,v)\in E_f,则

    δf(s,v)δf(s,u)+1δf(s,u)+1=δf(s,v)\delta_{f}(s,v)\leq \delta_{f}(s,u)+1\leq \delta_{f'}(s,u)+1=\delta_{f'}(s,v)

    此结果与我们假设的 δf(s,v)<δf(s,v)\delta_{f'}(s,v)<\delta_f(s,v) 矛盾。

  • 也就是说,(u,v)E(u,v)\notin E(u,v)Ef(u,v)\in E_{f'},由此可以推断,流量递增操作一定增加了从结点 vv 到结点 uu 的流量。

  • 所以残存网络 GfG_f 中从源点 ss 到结点 uu 的最短路径上的最后一条边是 (v,u)(v,u)。因此

    δf(s,v)=δf(s,u)1δf(s,u)1=δf(s,v)2\delta_{f}(s,v)=\delta_f(s,u)-1\leq \delta_{f'}(s,u)-1=\delta_{f'}(s,v)-2

    此结论与假设 δf(s,v)<δf(s,v)\delta_{f'}(s,v)<\delta_f(s,v) 矛盾,因此不存在这样的结点 vv,证毕。

**定理:**如果 Edmonds-Karp 算法运行在源点为 ss 且汇点为 tt 的流网络 G=(V,E)G=(V,E) 上,则该算法所执行的流量增加操作的总次数为 O(VE)O(VE)

证明:

  • 残存网络 GfG_f 中,如果一条路径 pp 的残存容量是该路径上边 (u,v)(u,v) 的残存容量,则称 (u,v)(u,v)关键边

  • 沿一条增广路径增加流后,该条路径上的所有关键边都会从 GfG_f 中消失,且每条增广路径至少有一条关键边。

  • 假设边 (u,v)(u,v),其第一次成为关键边时,我们有

    δf(s,v)=δf(s,u)+1\delta_{f}(s,v)=\delta_{f}(s,u)+1
  • 一旦增加流后,(u,v)(u,v) 将从 GfG_f 中消失,以后也不能出现在另一条增广路径上,直到从 uuvv 的网络流减小,并且 (u,v)(u,v) 出现在增广路径上。假设这一事件发生时流为 ff',则

    δf(s,u)=δf(s,v)+1\delta_{f'}(s,u)=\delta_{f'}(s,v)+1
  • 根据引理,我们可知 δf(s,v)δf(s,v)\delta_{f}(s,v)\leq \delta_{f'}(s,v),因此有

    δf(s,u)=δf(s,v)+1δf(s,v)+1=δf(s,u)+2\delta_{f'}(s,u)=\delta_{f'}(s,v)+1\geq \delta_{f}(s,v)+1=\delta_{f}(s,u)+2
  • 因此,(u,v)(u,v) 在两次成为关键边的间隔中,从 ssuu 的距离至少增加 2 个单位,且距离最初至少为零。同时,从 ssuu 的最短路径上中间结点不可能包括 ssuutt,因此距离最多增加至 V2|V|-2。所以一条边最多成为关键边 V/2|V|/2 次。

  • 由于一共有 E|E| 条边,因此在 Edmonds-Karp 算法过程中关键边的总数为 O(VE)O(VE)

  • 因为每条增广路径至少有一条关键边,因此流量增加操作总次数(增广路径数)为 O(VE)O(VE)

由于 Ford-Fulkerson 算法的每次迭代可以在 O(E)O(E) 时间内完成,因此 Edmonds-Karp 算法总运行时间为 O(VE2)O(VE^2)

番外:水平图 Level graph

给定一个有向图 G=(V,E)G=(V,E),源点为 ss,则它的水平图 LG=(V,EG)L_G=(V,E_G) 定义为:

  • l(v)=l(v)=ssvv 的最短路径的边的数量。
  • LG=(V,EG)L_G=(V,E_G)GG 的子图,只包含满足 l(w)=l(v)+1l(w)=l(v)+1 的边 (v,w)E(v,w)\in E
level_graph

我们可以通过运行 BFS 在 O(m+n)O(m+n) 的时间内计算出水平图。

性质:PPGGsvs\to v 的一条最短路径,当且仅当 PPLGL_Gsvs\to v 的一条路径。

© 2024 Hotel