算法模板——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,分别表示点的个数.有向边的个数.源点 ...
随机推荐
- javaweb入门实例---servlet例子
1.编写servlet: TreeDataServlet.java package com.maggie.tree; import java.io.IOException; import javax. ...
- IIS URLReWrite URL 重写模块 下载地址
https://www.microsoft.com/zh-cn/download/details.aspx?id=7435
- jQuery Deferred和Promise的使用介绍:
deferred对象是从jquery1.5.0引入的一个新对象,ES6也引入了Promise的正式规范. 抽象来说,deferreds 可以理解为表示需要长时间才能完成的耗时操作的一种方式,相比于阻塞 ...
- SimRank协同过滤推荐算法
在协同过滤推荐算法总结中,我们讲到了用图模型做协同过滤的方法,包括SimRank系列算法和马尔科夫链系列算法.现在我们就对SimRank算法在推荐系统的应用做一个总结. 1. SimRank推荐算法的 ...
- [css]《css揭秘》学习笔记(一)
一.background-clip属性 <html> <head> <meta charset="utf-8"> <title>背景 ...
- iOS自定义视图- SJTextView
需求: textView 需要placeholder用来提示输入 textView 要做字数限制 textView 禁止表情符号的输入 思考: 因为需求比较通用,便想通过自定义SJTextView来实 ...
- 背景图height:100%显示
这段时间,写移动端页面,总是遇到背景图在不同的设备上的显示拉伸问题: 本来想写百分比,可是并没有显示,又不想media@ ,换一种思路用img写 群友提供了一个办 html,body{height:1 ...
- Storyboard 自定义转场动画
在storyboard中,segue有几种不同的类型,在iphone和ipad的开发中,segue的类型是不同的.在iphone中,segue 有:push,modal,和custom三种不同的类型, ...
- uml系列(八)——部署图与构件图
之前说了uml的设计图,现在说一下uml的最后两种图:构件图.部署图.这两种图之所以放在一起是因为它们都是软件的实现图. 构件图 构件图是描述一组构件之间的组织与依赖关系的模型.那 ...
- 升级到appcompat v7 21.0.2之后遇到的问题解决方法
1)一开始是手动直接覆盖文件到对应的lib project下,提示数个style找不到.原因是新旧版本的文件命名和结构不同,所以这个问题只需要把project目录清空,重新复制文件即可解决. 2)发现 ...