实现功能:同最大流 1

这里面主要是把前面的邻接矩阵改成了邻接表,相比之下速度大大提高——本人实测,当M=1000000 N=10000 时,暂且不考虑邻接矩阵会不会MLE,新的程序速度快了很多倍(我们家这个很弱的电脑上耗时0.3s);而当M=300000 N=10000时,优势更加明显(几乎是秒出),别的没了,尤其当遇到稀疏图的时候这样子是大大划算的!!!

  1. type
  2. point=^node;
  3. node=record
  4. g,w:longint;
  5. next:point;
  6. end;
  7.  
  8. var
  9. i,j,k,l,m,n,tmp,ans,aug,mi,s,t:longint;
  10. di,a:array[..] of point;
  11. pre,his,dis,vh:array[..] of longint;
  12. flag:boolean;p,jl:point;
  13. function min(x,y:longint):longint;inline;
  14. begin
  15. if x<y then min:=x else min:=y;
  16. end;
  17. function add(x,y,z:longint):longint;inline;
  18. var p:point;
  19. begin
  20. new(p);p^.w:=z;p^.g:=y;
  21. p^.next:=a[x];a[x]:=p;
  22. end;
  23. procedure op(x,y,z:longint);inline;
  24. var p:point;
  25. begin
  26. p:=a[x];
  27. while p<>nil do
  28. begin
  29. if (p^.g=y) and ((p^.w+z)>=) then
  30. begin
  31. p^.w:=p^.w+z;
  32. break;
  33. end;
  34. p:=p^.next;
  35. end;
  36. end;
  37. begin
  38. readln(n,m,s,t);
  39. for i:= to n do a[i]:=nil;
  40. for i:= to m do
  41. begin
  42. readln(j,k,l);
  43. add(j,k,l);add(k,j,);
  44. end;
  45. for i:= to n do di[i]:=a[i];
  46. fillchar(dis,sizeof(dis),);
  47. fillchar(pre,sizeof(pre),);
  48. fillchar(his,sizeof(his),);
  49. fillchar(vh,sizeof(vh),);
  50. i:=s;vh[]:=n;ans:=;aug:=maxlongint;
  51. while dis[s]<n do
  52. begin
  53. flag:=false;his[i]:=aug;
  54. p:=a[i];
  55. while p<>nil do
  56. begin
  57. if (p^.w>) and (dis[i]=(dis[p^.g]+)) then
  58. begin
  59. aug:=min(aug,p^.w);
  60. pre[p^.g]:=i;di[i]:=p;
  61. flag:=true;i:=p^.g;
  62. if i=t then
  63. begin
  64. ans:=ans+aug;
  65. while i<>s do
  66. begin
  67. tmp:=i;
  68. i:=pre[i];
  69. op(i,tmp,-aug);
  70. op(tmp,i,aug);
  71. end;
  72. aug:=maxlongint;
  73. end;
  74. break;
  75. end;
  76. p:=p^.next;
  77. end;
  78. if flag then continue;
  79. jl:=nil;mi:=n-;
  80. p:=a[i];
  81. while p<>nil do
  82. begin
  83. if (p^.w>) and (dis[p^.g]<mi) then
  84. begin
  85. jl:=p;mi:=dis[p^.g];
  86. end;
  87. p:=p^.next;
  88. end;
  89. di[i]:=jl;
  90. dec(vh[dis[i]]);
  91. if vh[dis[i]]= then break;
  92. dis[i]:=mi+;
  93. inc(vh[dis[i]]);
  94. if i<>s then
  95. begin
  96. i:=pre[i];
  97. aug:=his[i];
  98. end;
  99. end;
  100. writeln(ans);
  101. end.

算法模板——sap网络最大流 2(非递归+邻接表)的更多相关文章

  1. 算法模板——sap网络最大流 3(递归+邻接表)

    实现功能:同前 程序还是一如既往的优美,虽然比起邻接矩阵的稍稍长了那么些,不过没关系这是必然,但更重要的一个必然是——速度将是一个质的飞跃^_^(这里面的point指针稍作了些创新——anti指针,这 ...

  2. 算法模板——sap网络最大流 3(递归+邻接矩阵)

    实现功能:同之前 可以看见的是这次的程序优美了许多,代码简短了一倍还多,可是速度却是和原来的邻接表一个级别的(在Codevs上面草地排水那题的运行时间比较,但是显然数据很大时应该比那个慢些),原理差不 ...

  3. 算法模板——sap网络最大流 1(非递归+邻接矩阵)

    实现功能:首行输入N,M,S,T,代表这张图N个点,M条边,源点为S,汇点为T:接下来T行输入个边的出发点.终点和权值:输出最大流 原理:sap网络流算法(详见百度百科,个人觉得这个模板已经不错了,虽 ...

  4. 算法模板——Dinic网络最大流 1

    实现功能:同sap网络最大流 今天第一次学Dinic,感觉最大的特点就是——相当的白话,相当的容易懂,而且丝毫不影响复杂度,顶多也就是代码长个几行 主要原理就是每次用spfa以O(n)的时间复杂度预处 ...

  5. 算法模板——Dinic网络最大流 2

    实现功能:同Dinic网络最大流 1 这个新的想法源于Dinic费用流算法... 在费用流算法里面,每次处理一条最短路,是通过spfa的过程中就记录下来,然后顺藤摸瓜处理一路 于是在这个里面我的最大流 ...

  6. P3376 【模板】网络最大流dinic算法

    P3376 [模板]网络最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点 ...

  7. P3376 【模板】网络最大流( Edmonds-krap、Dinic、ISAP 算法)

    P3376 [模板]网络最大流( Edmonds-krap.Dinic.ISAP 算法) 题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入格式 第一行包含四个正整数N.M.S ...

  8. P3376 【模板】网络最大流(luogu)

    P3376 [模板]网络最大流(luogu) 最大流的dinic算法模板(采取了多种优化) 优化 时间 inline+当前弧+炸点+多路增广 174ms no 当前弧 175ms no 炸点 249 ...

  9. P3376 【模板】网络最大流

    P3376 [模板]网络最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点 ...

随机推荐

  1. #DP# ----- OpenJudge最大子矩阵

    OpenJudge 1768:最大子矩阵 总时间限制: 1000ms   内存限制: 65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 ...

  2. Chrome控制台详解

    Chrome控制台详解 http://www.codeceo.com/article/chrome-console.html console.log('%casdf','font-size:16px; ...

  3. HttpURLConnection从网上获取Json数据并解析详解

    HttpURLConnection从网上获取Json数据并解析 1.HttpURLConnection请求数据的步骤 (1)构造一个URL接口地址: URL url = new URL("h ...

  4. EntityFramework Core解决并发详解

    前言 对过年已经无感,不过还是有很多闲暇时间来学学东西,这一点是极好的,好了,本节我们来讲讲EntityFramewoek Core中的并发问题. 话题(EntityFramework Core并发) ...

  5. 一篇完整的FlexBox布局指南

    一篇完整的FlexBox布局指南 转载请标注本文链接并附带以下信息: 译:Cydiacen 作者:CHRIS COYIER 原文:A Complete Guide to Flexbox 原文更新于 2 ...

  6. 如何开发基于Dubbo RPC的分布式服务?

    什么是Dubbo? Dubbo能做什么? 在Crystal框架下,如何开发基于Dubbo RPC的服务? 在Crystal框架下,如何调用Dubbo RPC服务? 相关的文章 什么是Dubbo? Du ...

  7. objectc中函数前的加号和减号

    看object-c中的代码里,函数(方法)前总有一个加号或者减号,不知道是什么意思,度娘了一下. http://zhidao.baidu.com/link?url=gw9-JR3bh0i7E_CHbr ...

  8. HDU3068(Manacher算法)

    最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  9. 深入了解GCD

    首先提出一些问题: dispatch_async 函数如何实现,分发到主队列和全局队列有什么区别,一定会新建线程执行任务么? dispatch_sync 函数如何实现,为什么说 GCD 死锁是队列导致 ...

  10. 基于Selenium2与Python自动化测试环境搭建

    简介: selenium 是一个web的自动化测试工具,不少学习功能自动化的同学开始首选selenium ,相因为它相比QTP有诸多有点: *  免费,也不用再为破解QTP而大伤脑筋 *  小巧,对于 ...