最初是从《挑战程序设计竞赛》上了解到 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)\notin 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$ 的距离也是不减的。

Dinic 算法钩沉的更多相关文章

  1. ACM/ICPC 之 Dinic算法(POJ2112)

    Optimal Milking //二分枚举最大距离的最小值+Floyd找到最短路+Dinic算法 //参考图论算法书,并对BFS构建层次网络算法进行改进 //Time:157Ms Memory:65 ...

  2. ISAP算法对 Dinic算法的改进

    ISAP算法对 Dinic算法的改进: 在刘汝佳图论的开头引言里面,就指出了,算法的本身细节优化,是比较复杂的,这些高质量的图论算法是无数优秀算法设计师的智慧结晶. 如果一时半会理解不清楚,也是正常的 ...

  3. [知识点]网络流之Dinic算法

    // 此博文为迁移而来,写于2015年2月6日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vrg4.html      ...

  4. 学习笔记 --- 最大流Dinic算法

    为与机房各位神犇同步,学习下网络流,百度一下发现竟然那么多做法,最后在两种算法中抉择,分别是Dinic和ISAP算法,问过 CA爷后得知其实效率上无异,所以决定跟随Charge的步伐学习Dinic,所 ...

  5. Power Network(网络流最大流 & dinic算法 + 优化)

    Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 24019   Accepted: 12540 D ...

  6. HDU 1532 (Dinic算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1532 题目大意: 就是由于下大雨的时候约翰的农场就会被雨水给淹没,无奈下约翰不得不修建水沟,而且是网络 ...

  7. poj 1459 Power Network : 最大网络流 dinic算法实现

    点击打开链接 Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 20903   Accepted:  ...

  8. POJ 1273 Drainage Ditches(网络流dinic算法模板)

    POJ 1273给出M条边,N个点,求源点1到汇点N的最大流量. 本文主要就是附上dinic的模板,供以后参考. #include <iostream> #include <stdi ...

  9. 【BZOJ】1001: [BeiJing2006]狼抓兔子 Dinic算法求解平面图对偶图-最小割

    1001: [BeiJing2006]狼抓兔子 Description 左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下 三种类型的道路 1:(x,y)<==>( ...

随机推荐

  1. BZOJ 3130: [Sdoi2013]费用流 网络流+二分

    3130: [Sdoi2013]费用流 Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 1230  Solved: ...

  2. linux+apache+mod_python+wechat_sdk搭建微信公共账号服务器

    linux+apache+mod_python+wechat_sdk搭建微信公共账号服务器 转载请注明本文原作者:FignerLiu PRE 最近尝试了下使用python搭建微信公共账号服务器,实现了 ...

  3. noip模拟赛#15

    #15 T1:a[i]>=a[i/2].输出a的最大字典序 =>可以发现这是二叉树的情况那么就先预处理出每个点有多少个儿子然后递归处理就可以了. #include<cstdio> ...

  4. 前缀树,trie树

    前缀树: 假设一个字符串数组,“abcd”,"bcd","gef" , 构建一颗树,字母是在路径上,节点上最基本的存储的信息包括: 以这个节点结尾的 字符串的数 ...

  5. Bootstrap标签页(Tab)插件事件

    事件 下表列出了标签页(Tab)插件中要用到的事件.这些事件可在函数中当钩子使用. 事件 描述 实例 show.bs.tab 该事件在标签页显示时触发,但是必须在新标签页被显示之前.分别使用 even ...

  6. 在Scrollview中使用AutoLayout

    AutoLayout 与 UIScrollView的相遇是一个不可避免的场景,像UITableView.UIWebView这些都是继承于UIScrollView的,关于它们的autolayout布局大 ...

  7. CE软件修改器

    下载地址: 链接:https://pan.baidu.com/s/1WQa5epfmLW92xk0XY10pqw 提取码:jt3k 喜欢请点赞

  8. Linux基础学习-NFS网络文件系统实时文件共享

    NFS网络文件系统 如果大家觉得Samba服务程序的配置太麻烦了,那么你共享文件的主机都是Linux系统,那么推荐大家在客户端部署nfs服务来共享文件.nfs(网络文件系统)服务可以将远程Linux系 ...

  9. 【MySQL】mac环境下使用navicat premium连接mysql乱码问题

    ---恢复内容开始--- 最重要的两点:使用navicat premium创建mysql连接和在mysql连接里面创建数据库时,需要注意. 1.创建连接时,Encoding不需要手动选择,保持Auto ...

  10. 装逼图片旋转合成demo

    测试背景 bg.jpg 测试图片 a.jpg 结果示例 代码demo <?php $bgImgFileName = 'bg.jpg'; $a = 'a.jpg'; // 初始化 $src = i ...