算法模板——sap网络最大流 2(非递归+邻接表)
实现功能:同最大流 1
这里面主要是把前面的邻接矩阵改成了邻接表,相比之下速度大大提高——本人实测,当M=1000000 N=10000 时,暂且不考虑邻接矩阵会不会MLE,新的程序速度快了很多倍(我们家这个很弱的电脑上耗时0.3s);而当M=300000 N=10000时,优势更加明显(几乎是秒出),别的没了,尤其当遇到稀疏图的时候这样子是大大划算的!!!
- type
- point=^node;
- node=record
- g,w:longint;
- next:point;
- end;
- var
- i,j,k,l,m,n,tmp,ans,aug,mi,s,t:longint;
- di,a:array[..] of point;
- pre,his,dis,vh:array[..] of longint;
- flag:boolean;p,jl:point;
- function min(x,y:longint):longint;inline;
- begin
- if x<y then min:=x else min:=y;
- end;
- function add(x,y,z:longint):longint;inline;
- var p:point;
- begin
- new(p);p^.w:=z;p^.g:=y;
- p^.next:=a[x];a[x]:=p;
- end;
- procedure op(x,y,z:longint);inline;
- var p:point;
- begin
- p:=a[x];
- while p<>nil do
- begin
- if (p^.g=y) and ((p^.w+z)>=) then
- begin
- p^.w:=p^.w+z;
- break;
- end;
- p:=p^.next;
- end;
- end;
- begin
- readln(n,m,s,t);
- for i:= to n do a[i]:=nil;
- for i:= to m do
- begin
- readln(j,k,l);
- add(j,k,l);add(k,j,);
- end;
- for i:= to n do di[i]:=a[i];
- fillchar(dis,sizeof(dis),);
- fillchar(pre,sizeof(pre),);
- fillchar(his,sizeof(his),);
- fillchar(vh,sizeof(vh),);
- i:=s;vh[]:=n;ans:=;aug:=maxlongint;
- while dis[s]<n do
- begin
- flag:=false;his[i]:=aug;
- p:=a[i];
- while p<>nil do
- begin
- if (p^.w>) and (dis[i]=(dis[p^.g]+)) then
- begin
- aug:=min(aug,p^.w);
- pre[p^.g]:=i;di[i]:=p;
- flag:=true;i:=p^.g;
- if i=t then
- begin
- ans:=ans+aug;
- while i<>s do
- begin
- tmp:=i;
- i:=pre[i];
- op(i,tmp,-aug);
- op(tmp,i,aug);
- end;
- aug:=maxlongint;
- end;
- break;
- end;
- p:=p^.next;
- end;
- if flag then continue;
- jl:=nil;mi:=n-;
- p:=a[i];
- while p<>nil do
- begin
- if (p^.w>) and (dis[p^.g]<mi) then
- begin
- jl:=p;mi:=dis[p^.g];
- end;
- p:=p^.next;
- end;
- di[i]:=jl;
- dec(vh[dis[i]]);
- if vh[dis[i]]= then break;
- dis[i]:=mi+;
- inc(vh[dis[i]]);
- if i<>s then
- begin
- i:=pre[i];
- aug:=his[i];
- end;
- end;
- writeln(ans);
- end.
算法模板——sap网络最大流 2(非递归+邻接表)的更多相关文章
- 算法模板——sap网络最大流 3(递归+邻接表)
实现功能:同前 程序还是一如既往的优美,虽然比起邻接矩阵的稍稍长了那么些,不过没关系这是必然,但更重要的一个必然是——速度将是一个质的飞跃^_^(这里面的point指针稍作了些创新——anti指针,这 ...
- 算法模板——sap网络最大流 3(递归+邻接矩阵)
实现功能:同之前 可以看见的是这次的程序优美了许多,代码简短了一倍还多,可是速度却是和原来的邻接表一个级别的(在Codevs上面草地排水那题的运行时间比较,但是显然数据很大时应该比那个慢些),原理差不 ...
- 算法模板——sap网络最大流 1(非递归+邻接矩阵)
实现功能:首行输入N,M,S,T,代表这张图N个点,M条边,源点为S,汇点为T:接下来T行输入个边的出发点.终点和权值:输出最大流 原理:sap网络流算法(详见百度百科,个人觉得这个模板已经不错了,虽 ...
- 算法模板——Dinic网络最大流 1
实现功能:同sap网络最大流 今天第一次学Dinic,感觉最大的特点就是——相当的白话,相当的容易懂,而且丝毫不影响复杂度,顶多也就是代码长个几行 主要原理就是每次用spfa以O(n)的时间复杂度预处 ...
- 算法模板——Dinic网络最大流 2
实现功能:同Dinic网络最大流 1 这个新的想法源于Dinic费用流算法... 在费用流算法里面,每次处理一条最短路,是通过spfa的过程中就记录下来,然后顺藤摸瓜处理一路 于是在这个里面我的最大流 ...
- P3376 【模板】网络最大流dinic算法
P3376 [模板]网络最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点 ...
- P3376 【模板】网络最大流( Edmonds-krap、Dinic、ISAP 算法)
P3376 [模板]网络最大流( Edmonds-krap.Dinic.ISAP 算法) 题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入格式 第一行包含四个正整数N.M.S ...
- P3376 【模板】网络最大流(luogu)
P3376 [模板]网络最大流(luogu) 最大流的dinic算法模板(采取了多种优化) 优化 时间 inline+当前弧+炸点+多路增广 174ms no 当前弧 175ms no 炸点 249 ...
- P3376 【模板】网络最大流
P3376 [模板]网络最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点 ...
随机推荐
- #DP# ----- OpenJudge最大子矩阵
OpenJudge 1768:最大子矩阵 总时间限制: 1000ms 内存限制: 65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 ...
- Chrome控制台详解
Chrome控制台详解 http://www.codeceo.com/article/chrome-console.html console.log('%casdf','font-size:16px; ...
- HttpURLConnection从网上获取Json数据并解析详解
HttpURLConnection从网上获取Json数据并解析 1.HttpURLConnection请求数据的步骤 (1)构造一个URL接口地址: URL url = new URL("h ...
- EntityFramework Core解决并发详解
前言 对过年已经无感,不过还是有很多闲暇时间来学学东西,这一点是极好的,好了,本节我们来讲讲EntityFramewoek Core中的并发问题. 话题(EntityFramework Core并发) ...
- 一篇完整的FlexBox布局指南
一篇完整的FlexBox布局指南 转载请标注本文链接并附带以下信息: 译:Cydiacen 作者:CHRIS COYIER 原文:A Complete Guide to Flexbox 原文更新于 2 ...
- 如何开发基于Dubbo RPC的分布式服务?
什么是Dubbo? Dubbo能做什么? 在Crystal框架下,如何开发基于Dubbo RPC的服务? 在Crystal框架下,如何调用Dubbo RPC服务? 相关的文章 什么是Dubbo? Du ...
- objectc中函数前的加号和减号
看object-c中的代码里,函数(方法)前总有一个加号或者减号,不知道是什么意思,度娘了一下. http://zhidao.baidu.com/link?url=gw9-JR3bh0i7E_CHbr ...
- HDU3068(Manacher算法)
最长回文 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 深入了解GCD
首先提出一些问题: dispatch_async 函数如何实现,分发到主队列和全局队列有什么区别,一定会新建线程执行任务么? dispatch_sync 函数如何实现,为什么说 GCD 死锁是队列导致 ...
- 基于Selenium2与Python自动化测试环境搭建
简介: selenium 是一个web的自动化测试工具,不少学习功能自动化的同学开始首选selenium ,相因为它相比QTP有诸多有点: * 免费,也不用再为破解QTP而大伤脑筋 * 小巧,对于 ...