zoukankan      html  css  js  c++  java
  • 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$ 的距离也是不减的。

  • 相关阅读:
    base标签使用
    自定义cell的背景图(色)
    如何在iphone 4上使用高分图
    转iphone元素的尺寸
    mac下显示隐藏文件的方法
    转iphone如何调试EXC_BAD_ACCESS
    iphone sleep方法
    uitable view自带的动画效果
    iphone 直接中转到appstore
    uitableview 默认选中第一行
  • 原文地址:https://www.cnblogs.com/Patt/p/7144379.html
Copyright © 2011-2022 走看看