ISAP 算法
Dinic 算法其实已经足够处理大多数的网络流了,但还不够快。接下来介绍的是最优秀的增广路最大流算法:ISAP(Improve Shortest Argumenting Path)。它的时间复杂度上界与 Dinic 一样,为 \(O(n ^ 2 \cdot m)\)。
先分析 Dinic 的优化空间。Dinic 必须在每一次 dfs 前通过 bfs 获取一次所有点的深度(Depth),这样做效率是极其低下的。ISAP 通过一种神奇的方法解决了这个问题。
ISAP 对深度有不同的定义。对于一个点 \(i\),它的深度 \(dep_i\) 为源点 \(s\) 到汇点 \(t\) 的最短距离与它到源点 \(s\) 的最短距离的差。另外,定义 \(gap_i\) 为所有满足 \(dep_j = i\) 的点 \(j\) 的数量,即所有深度为 \(i\) 的点数。显然,当 \(\exists i\) 使得 \(gap_i = 0\) 时,即分层图出现断层时,残余网络中不存在一条自 \(s\) 到 \(t\) 的增广路。
int dfs(int node, int flow){
if(node == t || !flow)
return flow;
int stream = 0, f;
for(int i = head[node]; i != -1; i = edge[i].next)
if(dep[edge[i].to] == dep[node] - 1 && (f = dfs(edge[i].to, min(flow, edge[i].capacity)))){
flow -= f, stream += f;
edge[i].capacity -= f, edge[i ^ 1].capacity += f;
if(!flow)
return stream;
}
......
return stream;
}
上面是 ISAP 的 dfs 代码片段。可以发现,除了隐藏的省略号部分,它和 Dinic 的是几乎一样的。而隐藏部分是为了更新 \(dep\) 和 \(gap\),省去多次的 bfs。
执行“......”的先决条件是 \(flow \neq 0\)。此时说明该点 \(node\) 已经没有出边能够接受流量了,那么只需要
if(--gap[dep[node]++])
++gap[dep[node]];
else
gap[s] = n + 1;
即可更新 \(dep\) 和 \(gap\)。
这样的算法不但优秀,也很好写,可以作为网络流的主要算法。
ISAP 算法的更多相关文章
- ISAP算法对 Dinic算法的改进
ISAP算法对 Dinic算法的改进: 在刘汝佳图论的开头引言里面,就指出了,算法的本身细节优化,是比较复杂的,这些高质量的图论算法是无数优秀算法设计师的智慧结晶. 如果一时半会理解不清楚,也是正常的 ...
- 网络流-最大流问题 ISAP 算法解释(转自Renfei Song's Blog)
网络流-最大流问题 ISAP 算法解释 August 7, 2013 / 编程指南 ISAP 是图论求最大流的算法之一,它很好的平衡了运行时间和程序复杂度之间的关系,因此非常常用. 约定 我们使用邻接 ...
- ISAP 算法的学习
http://www.renfei.org/blog/isap.html 算法与数学 网络流-最大流问题 ISAP 算法解释 2013-08-07Renfei Song 2 条评论 内容提要 [隐藏] ...
- 网络流 ISAP算法
网络流问题: 我自己理解,在流网络中,在不违背容量限制的条件下,解决各种从源点到汇点的问题. ISAP算法概念: 据说不会有卡ISAP时间的题目---时间复杂度O(E^2*V) 首先原理都是基于不断寻 ...
- P3376 【模板】网络最大流( Edmonds-krap、Dinic、ISAP 算法)
P3376 [模板]网络最大流( Edmonds-krap.Dinic.ISAP 算法) 题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入格式 第一行包含四个正整数N.M.S ...
- HDOJ-3416(最大流+最短路+ISAP算法+向前星dijikstra算法+如何判断一条边是否在最短路中)
Marriage Match IV HDOJ-3416 这题的题意就是要找两点之间最短路的路径个数,而且边不能重复. 最大流和最短路的结合.首先正向和反向建图,再跑两遍dijikstra.到这里就求出 ...
- ISAP算法
为什么叫ISAP ISAP(Improved Shortest Augment Path):改进的最短增广路,属于增广路算法 算法 Dinic算法中,我们每次都需要BFS出层次图,而在ISAP中,我们 ...
- CCF(引水入城:60分):最大流+ISAP算法
引水入城 201703-5 这从题目分析来看很像最大流的问题,只需要增加一个超级源点和一个超级汇点就可以按照题意连边再跑最大流算法. 因为数据量太大了,肯定会超时.但是没有想到可行的解决方法. #in ...
- HDU4280 Island Transport —— 最大流 ISAP算法
题目链接:https://vjudge.net/problem/HDU-4280 Island Transport Time Limit: 20000/10000 MS (Java/Others) ...
随机推荐
- mysql DATE_FORMAT 函数使用
使用DATE_FORMAT 查询数据库中时间类型显示 SELECT a.name ,a.uuid ,p.assess_price as assessPrice ,p.assess_date as as ...
- js分享微信 ,微博 ,qq空间
目前pc微信分享,是通过扫描二维码进行分享 var _title,_source,_sourceUrl,_pic,_showcount,_desc,_summary,_site, _width = , ...
- Windows server 2012 R2 服务器用户自动锁定
开启共享文件夹后,发现经常会自动锁定导致,共享用户无法正常访问共享文件夹(原因不明) 解决办法,打开本地安全策略 把账户锁定阈值改为0
- Java后台技术(线程安全)
前端时间一个同事因为后台线程安全问题出了一次生产事故,今天我就对线程安全问题进行一次总结. 首先,我们来大致看以下我同事写的代码,代码我进行了精简,大致如下: for (final String re ...
- matplotlib学习(1)
1.基本学习(1)1.1 代码: import matplotlib.pyplot as plt import numpy as np x=np.linspace(-1,1,50) #从-1到1,共5 ...
- Node.js介绍、优势、用途
一.Node.js介绍Node.js是一个javascript运行环境.它让javascript可以开发后端程序,实现几乎其他后端语言实现的所有功能,可以与PHP.Java.Python..NET.R ...
- NLP直播-1 词向量与ELMo模型
翻车2次,试水2次,今天在B站终于成功直播了. 人气11万. 主要讲了语言模型.词向量的训练.ELMo模型(深度.双向的LSTM模型) 预训练与词向量 词向量的常见训练方法 深度学习与层次表示 LST ...
- 【CSS 】js操作css
对设置和移除所有 <p> 元素的 "main" 类进行切换: $("button").click(function(){ $("p&quo ...
- HtmlUnit-API的使用就介绍
转自:https://www.cnblogs.com/luotinghao/p/3800054.html 网络爬虫第一个要面临的问题,就是如何抓取网页,抓取其实很容易,没你想的那么复杂,一个开源Htm ...
- Root密码忘记修改方式!
方法一:进入单用户: Linux系统开机进入引导画面,选择:CentOS Linux(3.10.0-693.e17.x86_64)7 (Core) ,按字母 "E"键,进入Li ...