Dinic算法复杂度证明
3235
2022.05.15
2022.05.31
发布于 未知归属地

「图论」相关证明文章见如下帖子:
图论相关证明文章列表


【目录】

  1. Dinic算法复杂度证明

    1. 证明时间复杂度

      1. 1. BFS建立分层图
      2. 2. 一次DFS增广
      3. 3. 一个阶段中DFS增广次数
      4. 4. 阶段数(分层图建立次数)

Dinic算法复杂度证明

前段时间学习图论,对一些算法正确性和复杂度的证明有些兴趣,这篇证明是当时的一个心血之作,起初看了Dinitz老爷子本人的论文,和Cornell大学的一个lecture讲义都没看懂(其实上面都有详细证明,但我比较笨,没看懂),后来在Duke大学的lecture讲义中找到了我能看懂的证明的关键,本文的证明以其为基础。实际上Duke大学的这个证明也没完全看懂(比如他的证明里有可以取等号的地方一律取了更松的不等号,不太不明白这么做有什么好处),但它提供的思路让我最终缝合出一个(我认为)还算严谨的证明。如果你也遍寻不到令你满意的Dinic算法复杂度证明,不妨看看我的这篇文章,欢迎你的指正!

※ 本文需要先理解Edmonds-Karp算法复杂度证明。这两篇文章数月前都曾发布在知乎上。


Dinic算法 相比EK算法以BFS方式实现FF方法中的增广操作,在Dinic算法中,采用BFS和DFS结合的方式增广。首先引入 高度标号(层次标号)分层图 的概念。以BFS算法从 ,标记 为第1层, 的邻接顶点为第2层,以此类推 为最后一层。执行一次BFS,赋予每个顶点高度标号信息,此时的图称作 分层图(层次图)。在此分层图内以DFS方式反复寻找增广路并执行增广操作(找到饱和边,发送和发回流),累计发送流。完成当前分层图的所有增广操作称作 一个阶段。一个阶段结束后,重置高度标号信息,再次执行BFS得到新的分层图并重复DFS的增广操作,直到无法分层 时说明 已无增广路,算法结束,此时得到的发送流总和即为 最大流

高度标号的作用:在以DFS增广时,每次从顶点 到其邻接顶点 的路径增长,都要考察 的的高度是否比 的高度大1,以此来保证路径总是能按步增长到最后一层的 (在有增广路的前提下)。

证明时间复杂度

如下证明参考了COMPSCI 638: Graph Algorithms, Lecture3

1. BFS建立分层图

可参考无权最短路径复杂度分析,略。

2. 一次DFS增广

在分层图中,由于高度标号加一的判断条件限制,DFS只能沿着高度递增的方向从 推进,因此单次DFS推进次数最多不超过 次,时间复杂度为

3. 一个阶段中DFS增广次数

在分层图中,每次DFS增广的结果使得一条高度递增方向上的饱和边 消失,此边的反向边 增加。如前述,增广路只能沿着高度递增的方向,而同一阶段内(同一张分层图中)反向边是沿着高度递减方向增加的。 消失后再次出现的条件是 为此后某次增广路上的饱和边。再次强调,在 同一阶段内 (同一张分层图中),方向是高度递减的,不可能出现在增广路上,因此一条高度递增边 被删除后不会再次出现。一次增广至少令一条高度递增边饱和并删除,高度递增边数量不大于,于是 一个阶段内DFS的次数最多为 ,即 。结合 2 可知,一个阶段的总复杂度为单次DFS的复杂度与DFS次数的乘积,即

4. 阶段数(分层图建立次数)

此证明是难点。 如前述,在层高递增条件的限制下, 最短路径长度即 的层高,因此最短路径最大不超过 。如果能证明每次分层图使得 最短路径长 「严格」递增 ,则立即推出阶段数(分层图建立次数)的上限为 ,复杂度为 。最短路径长严格递增的证明如下。

令相邻的两次分层图为 ,以 分别表示 中的 的最短距离。

  1. Edmonds-Karp算法复杂度证明已知 (这一点很重要),删正向边加反向边的操作,使得源点 到任意一点 的距离是非递减的,即 必有 。对证明过程稍加改造很容易得到一个对汇点 来说类似的结论,即删正向边加反向边的操作,使得任意一点 到汇点 的距离是非递减的,即 必有

    (1)

    (2)

对于 来说有 。接下来的证明目标是拿掉该不等式中的等号,证明 相比 ,严格地有 。可用反证法证明不可能取等号

  1. 假设 可以取到等号
    有一条 的最短路径 ,则一定存在边 ,是 某条增广路饱和边的反向边。因为如果 都是 中存在的边,由于 ,这样的 路径在 中就一定已经被找到了。因此在 中有 ,于是有

    (3)

image.png

  1. 由 (1) 和 (2) 易知

    (4)

    (5)

  2. 路径长可写成 ,应用 (4) 和 (5) 得到

    又由 (3) 得到

    (6)

由此, 的假设不成立,但我们知道 ,因此有 ,也即证明了Dinic算法中下一分层图的最短路径长度与前一分层图相比严格递增


综上,总时间复杂度为每个阶段建立分层图的复杂度 与在该分层图内执行的总DFS复杂度 之和乘以阶段数 ,为 ,即

评论 (5)