最大流-最小割 MAXFLOW-MINCUT ISAP
简单的叙述就不必了。
对于一个图,我们要找最大流,对于基于增广路径的算法,首先必须要建立反向边。
反向边的正确性:
我努力查找了许多资料,都没有找到理论上关于反向边正确性的证明。
但事实上,我们不难理解,对于每条反向边,我们流过它相当于撤销了一条正向边的流量。
并且它是必须的:
而且从理论上,我们在加入反向边之后得到的最大流,我们从残余网络考虑。
我们要认识到,反向边不会使最大流流量减少,这是很显然的。有flow<=flow'。
接下来我们考虑所有点的流量是否可以只用正向边得到。
并且我们考察汇点,由于汇点没有出边,所有的反向边都是从它离开的,那么显然不会对汇点造成影响。
对于其他点,我们考虑一条反向边的容量取决于正向边的流量,及总有flow_positive=capacity_negative,
或者换一个说法,flow_positive=-flow_negative。
也就是说,如果从这个点出去的流是通过u->v这条反向边出去的,这个流流向k,那么必然有相同流量的流从v->u,
那么不如直接从v->k好了。(如果这个u->v->k包含其他反向边,那么就递归下去讨论,但问题规模减少。)
这样就意识流的证明完了。
最大流最小割定理:
有一种普遍的证法,首先任意可行流的流量不可能大于任意一种割。即有最小割>=任意可行流。
并且由于最大流算法,最大流的得出来的残余网络源点、汇点必然不连通,否则最大流可以更大(沿着联通的路径流过去可以更大)。
这个时候最大流算法得到了其中一个割。
即有最大流>=最小割。
所以有最大流=最小割。
要找到最大流,我们有一个非常直观的想法,不断的在残余网络中找S-T的路径,如果找到就流过去,流量自然而然的+1,这些便流量减少。
这就是简易的Fold-Fulkerson算法,它是正确的。
Fold-Fulkerson FF算法正确性证明:
首先FF算法能够得到一个割,上面我们证明了割的容量总大于任意的流量,那么FF得到的流显然就是最大流了。
在FF算法上,根据最短路的性质,可以证明每次根据残余网络的最短路径的可行路径流过去可以达到O(V^2E)的算法复杂度
——EK算法
EK算法可以说是第一个SAP(Shortest Augment Path 最短增广路径)算法,在这之后的dinic只是一种扩展。
事实上,在学习了之后,可以发现dinic和ISAP实际上十分相似。
理论上ISAP是加了更多优化的。
在利用预标号的技术后,ISAP应该是不会劣于Dinic的。但事实上poi的kos和NOI的海拔都使ISAP跪掉了(听说?)
不过我觉得很有可能是写搓了。
特别要注意,在分层图上,预标号是必需的。
比如bzoj1001的狼抓兔子(本人ISAP跑了1200ms)中,如果不加预标号,一定是跑不过的。
但加了之后,比dinic快2/3,并且比一些转了最短路的算法都要快一点。
Reference:
- https://tadvent.wordpress.com/2009/04/07/usaco-4-2-1-ditch-%E7%BD%91%E7%BB%9C%E6%9C%80%E5%A4%A7%E6%B5%81%E9%97%AE%E9%A2%98%E7%AE%97%E6%B3%95%E5%B0%8F%E7%BB%93/
- http://www.cs.yale.edu/homes/aspnes/pinewiki/MaxFlow.html
- https://en.wikipedia.org/wiki/Maximum_flow_problem
- http://blog.csdn.net/qq_21110267/article/details/43540483
最大流-最小割 MAXFLOW-MINCUT ISAP的更多相关文章
- ISAP 最大流 最小割 模板
虽然这道题用最小割没有做出来,但是这个板子还是很棒: #include<stdio.h> #include<math.h> #include<string.h> # ...
- UVa11248 Frequency Hopping(最大流+最小割)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33206 [思路] 最大流最小割. 可以确定的是如果不可行需要修改的 ...
- matlab练习程序(最大流/最小割)
学习这个算法是为学习图像处理中的图割算法做准备的. 基本概念: 1.最大流是一个有向图. 2.一个流是最大流,当且仅当它的残余网络中不包括增广路径. 3.最小割就是网络中所有割中值最小的那个割,最小割 ...
- 最大流&最小割 - 专题练习
[例1][hdu5889] - 算法结合(BFS+Dinic) 题意 \(N\)个点\(M\)条路径,每条路径长度为\(1\),敌人从\(M\)节点点要进攻\(1\)节点,敌人总是选择最优路径即最短路 ...
- 「网络流24题」「LuoguP2774」方格取数问题(最大流 最小割
Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.对于给定的方 ...
- HDU6582 Path【优先队列优化最短路 + dinic最大流 == 最小割】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6582 来源:2019 Multi-University Training Contest 1 题目大意 ...
- 最大流/最小割模板(isap) POJ1273
isap模板核心代码: //d[]为距离标号数组,d[i]表示节点i到汇点的距离 //gap[]为GAP优化数组,gap[i]表示到汇点距离为i的节点个数 int dfs(int k,int flow ...
- 最大流&最小割&费用流模版
好久都没有搞博客了.想认真写又要准备文化课期末了. ISAP 流程: 原理就是dfs找增广路. 最基础的建反向边以便反悔就不说了. 但是记录一个dep(dis)表示层数,一开始BFS(从t开始,dis ...
- 网络流 最大流—最小割 之SAP算法 详解
首先引入几个新名词: 1.距离标号: 所谓距离标号 ,就是某个点到汇点的最少的弧的数量(即边权值为1时某个点到汇点的最短路径长度). 设点i的标号为level[i],那么如果将满足level[i]=l ...
随机推荐
- AD域的安装(在Windows Server 2003中安装Active Directory)
在Active Directory中提供了一组服务器作为身份验证服务器或登录服务器,这类服务器被称作域控制器(Domain Controller,简称DC).建立一个AD域的过程实际就是在一台运行Wi ...
- client offset screen 的区别
clientX 设置或获取鼠标指针位置相对于窗口客户区域的 x 坐标,其中客户区域不包括窗口自身的控件和滚动条. clientY 设置或获取鼠标指针位置相对于窗口客户区域的 y 坐标,其中客户区域不包 ...
- android中xml tools属性详解
第一部分 安卓开发中,在写布局代码的时候,ide可以看到布局的预览效果. 但是有些效果则必须在运行之后才能看见,比如这种情况:TextView在xml中没有设置任何字符,而是在activity中设置了 ...
- eclipse软件创建servlet
网上找了好多资料,eclipse创建servlet后,发到tomcat下发布,不能编译,生产class文件. 很多回答的都是一知半解,太气人了,看书.把资料找了一天,才发现是没有servlet-api ...
- 解决pip安装超时
我们在使用python开发的时候总会需要安装很多第三方模块 比如我用flask搭建web, 需要很多第三方模块,比如flask-sqlalchemy, flask-bootstrap等等.而这些模块用 ...
- php关于ob_start('ob_gzhandler')启用GZIP压缩的bug
如果使用ob_start("ob_gzhandler"); 则ob_clean()后面的输出将不显示,这是个bug,可以用ob_end_clean();ob_start(" ...
- MySql的一些用法
1.怎样找到MySql数据的存储目录? 答:从服务中查看正在运行的MySql,查看它的启动参数,可能是这个样子: "D:\Program Files\MySQL\MySQL Server 5 ...
- 在WebPart中获取Office 365中的未读邮件数
// Create the web request HttpWebRequest request = WebRequest.Create("https://outlook.office365 ...
- linux vim 插入行号
1 在文本中插入行号 最近有朋友提到某编辑器有一个可以插入行号的插件,问Vim有没有办法可以在文章中插入行号.%$^&*#8~#$@#!--让我们看一下有多少种方式可以在vim中插入行号或数字 ...
- HTML 5 背离贪吃蛇 写成了类似于屏幕校准
中间写了改 改了写 还是没做出自己满意的效果 ,看来自己的确不是一个走前端的料子.当然h5还是学一点好一点 具体说来 就是 在canvas 的画布中 鼠标点击后画上一个圆形 然后就有随机的在画布上面出 ...