• Dinic 算法钩沉


    最初是从《挑战程序设计竞赛》上了解到 Dinic 算法的。其中对于 Dinic 算法中的关键词——分层图(layered network,也称『层次图』)的引入的解释如下:

    因为最短增广路(shortest augmenting path,SAP)的长度在增广过程中始终不会变短,所以无需每次都通过 BFS 来寻找 SAP。我们可以先进行一次 BFS,然后考虑由近距离顶点指向远距离顶点的边所组成的分层图,在上面进行 DFS 寻找 SAP。如果在分层图上找不到新的增广路了,则说明 SAP 的长度确实变长了,或不存在增广路了,于是重新通过 BFS 构造新的分层图。

    关于

    SAP 的长度在增广过程中始终不会变短

    这一性质,《算法导论》上证明了一个比之更强的引理 (Lemma 26.7):

    If the Edmonds-Karp algorithm is run on a flow network $G=(V,E)$ with source $s$ and sink $t$, then for all vertices $v in V-{s,t}$, the shortest-path distance $delta_f(s,v)$ in the residual network $G_f$ increases monotonically with each flow augmentation.

    证明如下:

    将增广前后的流分别记做 $f$ 和 $f'$,用 $delta_{f}(u,v)$ 表示在剩余网络 $G_f$ 上 从 $u$ 到 $v$ 的距离。设 $v$ 是增广后与 $s$ 的距离变短了的所有顶点中距 $s$ 最近(这里『距 $s$ 最近』是指在 $G_{f'}$ 中距 $s$ 最近)的顶点,并设在 $G_{f'}$ 中 $v$ 的一个前驱为 $u$(即 $(u,v)in E_{f'}$ 且 $delta_{f'}(s,u) < delta_{f'}(s,v)$ )。此时可断言 $(u,v) otin E_f$,即 $(u,v)$ 是 $G_{f'}$ 中新出现的弧。从而增广路经过弧 $(v,u)$ 。(注意,此引理讨论的是 EK 算法。)EK 算法总是沿着 SAP 增广,所以 $delta_{f}(s,v) < delta_{f}(s,u)$ 。再结合 $delta_{f'}(s,u) < delta_{f'}(s,v)$ 和 $delta_{f'}(s,v) < delta_{f}(s,v)$,得 $delta_{f'}(s,u) < delta_{f}(s,u)$ ,即增广后 $u$ 与 $s$ 的距离也变短了,又 $delta_{f'}(s,u) < delta_{f'}(s,v)$ ,从而与『$v$ 是增广后与 $s$ 的距离变短了的所有顶点中距 $s$ 最近的顶点』矛盾。

    类似的,可以证明在 Edmonds-Karp 算法(或者说 SAP 算法)中,每次增广后,从任一顶点 $v$ 到汇点 $t$ 的距离也是不减的。

  • 相关阅读:
    测试一下你的T-SQL基础知识-count
    测试一下你的T-SQL基础知识-subquery
    Microsoft SQL Server 2012 管理 (2): Auditing
    Webpack
    react
    Webpack 傻瓜式指南(一)
    谈谈react-router学习
    使用Flexible 实现手淘H5 页面的终端适配学习
    Promise 让异步更优
    基于LeanCloud云引擎的Web全栈方案
  • 原文地址:https://www.cnblogs.com/Patt/p/7144379.html
Copyright © 2020-2023  润新知