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)\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 算法钩沉的更多相关文章
- ACM/ICPC 之 Dinic算法(POJ2112)
Optimal Milking //二分枚举最大距离的最小值+Floyd找到最短路+Dinic算法 //参考图论算法书,并对BFS构建层次网络算法进行改进 //Time:157Ms Memory:65 ...
- ISAP算法对 Dinic算法的改进
ISAP算法对 Dinic算法的改进: 在刘汝佳图论的开头引言里面,就指出了,算法的本身细节优化,是比较复杂的,这些高质量的图论算法是无数优秀算法设计师的智慧结晶. 如果一时半会理解不清楚,也是正常的 ...
- [知识点]网络流之Dinic算法
// 此博文为迁移而来,写于2015年2月6日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vrg4.html ...
- 学习笔记 --- 最大流Dinic算法
为与机房各位神犇同步,学习下网络流,百度一下发现竟然那么多做法,最后在两种算法中抉择,分别是Dinic和ISAP算法,问过 CA爷后得知其实效率上无异,所以决定跟随Charge的步伐学习Dinic,所 ...
- Power Network(网络流最大流 & dinic算法 + 优化)
Power Network Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 24019 Accepted: 12540 D ...
- HDU 1532 (Dinic算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1532 题目大意: 就是由于下大雨的时候约翰的农场就会被雨水给淹没,无奈下约翰不得不修建水沟,而且是网络 ...
- poj 1459 Power Network : 最大网络流 dinic算法实现
点击打开链接 Power Network Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 20903 Accepted: ...
- POJ 1273 Drainage Ditches(网络流dinic算法模板)
POJ 1273给出M条边,N个点,求源点1到汇点N的最大流量. 本文主要就是附上dinic的模板,供以后参考. #include <iostream> #include <stdi ...
- 【BZOJ】1001: [BeiJing2006]狼抓兔子 Dinic算法求解平面图对偶图-最小割
1001: [BeiJing2006]狼抓兔子 Description 左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下 三种类型的道路 1:(x,y)<==>( ...
随机推荐
- 如何处理SAP云平台错误消息 there is no compute unit quota for subaccount
当我试图部署一个应用到SAP云平台的neo环境时: 指定Compute Unit Size为Lite: 点击Deploy按钮,遇到如下错误消息:there is no compute unit quo ...
- [转]maven项目部署到tomcat
其实maven项目部署到tomcat的方式很多,我从一开始的打war包到tomcat/webapps目录,到使用tomcat-maven插件,到直接使用servers部署,一路来走过很多弯路. 下面就 ...
- 11gR2 新特性: Rebootless Restart
众所周知,当集群出现问题时,例如某个节点丢失网络心跳,或者不能够访问表决盘,或者节点出现了严重的性能问题等,CRS会选择将某个节点的OS 重启,以便保证集群的一致性.当然,大部分的重启都是由CRS的核 ...
- Python 继承实现的原理(继承顺序)
继承顺序 Python3 : 新式类的查找顺序:广度优先 新式类的继承: class A(object): Python2 3 都是了 MRO算法--生成一个列表保存继承顺序表 不找到底部 Pytho ...
- tmpfs与内存盘
如何快速的吃掉一段内存:通过tmpfs来划一片领地,再用dd去粗暴占用mount -t tmpfs -o size=512M tmpfs /mnt/demodd if=/dev/zero of=/mn ...
- iOS--获取文件目录的方法
很多文章都有写这个问题,我只是为了记录一下,免得总翻书... 1.Documents 目录: 你应该将所有的应用程序数据文件写入到这个目录下.这个目录用于存储用户数据或其它应该定期备份的信息. 2.L ...
- nginx下配置laravel+rewrite重写
server { listen ; server_name ha.d51v.cn; #access_log /data/wwwlogs/access_nginx.log combined; root ...
- paper:synthesizable finit state machine design techniques using the new systemverilog 3.0 enhancements之onehot coding styles(encoded-parameter style with registered outputs不推荐但是经常有人写这样的代码)
这样写法,不利与综合,case语句中比较也是full-vector比较.
- lavarel 添加自定义辅助函数
Laravel 提供了很多 辅助函数,有时候我们也需要创建自己的辅助函数. 必须 把所有的『自定义辅助函数』存放于 bootstrap 文件夹中. 并在 bootstrap/app.php 文件的最顶 ...
- Python中的列表(1)
1.什么是列表? 列表是由一组按特定顺序排列的元素组成. 2.如何表示? 在Python中用方括号([ ])来表示列表.栗子如下: contries = ['China','England','Fra ...