这篇博客写得非常好呀。

传送门

于是我是DCOI这一届第一个网络流写ISAP的人了,之后不用再被YKK她们嘲笑我用Dinic了!就是这样!

感觉ISAP是会比Dinic快,只分一次层,然后不能增广了再更新dis,再加上杂七杂八的优化,但是写起来要比Dinic稍微复杂一点点。

洛谷的模板比我改过后的Dinic又快了两倍多。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<cmath>
  6. #include<queue>
  7. #include<vector>
  8. typedef long long LL;
  9. const int maxn=,maxm=,INF=0x7f7f7f7f;
  10. using namespace std;
  11. int n,m,s,t,u,v,w,ecnt=,fir[maxn],d[maxn],cur[maxn],c[maxn],p[maxn];
  12. struct edge {
  13. int from,to,cap,flow,nxt;
  14. edge(){}
  15. edge(int from,int to,int cap,int flow,int nxt):from(from),to(to),cap(cap),flow(flow),nxt(nxt){}
  16. }e[maxm];
  17. void add(int u,int v,int w) {
  18. e[++ecnt]=edge(u,v,w,,fir[u]);
  19. e[++ecnt]=edge(v,u,,,fir[v]);
  20. fir[u]=ecnt-; fir[v]=ecnt;
  21. }
  22. void init() {
  23. scanf("%d%d%d%d",&n,&m,&s,&t);
  24. for(int i=;i<=m;i++) {
  25. scanf("%d%d%d",&u,&v,&w);
  26. add(u,v,w);
  27. }
  28. }
  29. queue<int>que;
  30. void bfs(int s,int t) {
  31. for(int i=;i<=n;i++) d[i]=n;
  32. d[t]=;
  33. que.push(t);
  34. while(!que.empty()) {
  35. int x=que.front() ;que.pop();
  36. for(int i=fir[x];i;i=e[i].nxt)
  37. if(d[e[i].to]==n&&e[i].flow==e[i].cap) {
  38. d[e[i].to]=d[x]+;
  39. que.push(e[i].to);
  40. }
  41. }
  42. }
  43. int cal(int s,int t) {
  44. int fl=INF;
  45. for(int x=t;x!=s;x=e[p[x]].from)
  46. fl=min(fl,e[p[x]].cap-e[p[x]].flow);
  47. for(int x=t;x!=s;x=e[p[x]].from) {
  48. e[p[x]].flow+=fl;
  49. e[p[x]^].flow-=fl;
  50. }
  51. return fl;
  52. }
  53. int Maxflow(int s,int t) {
  54. bfs(s,t);
  55. int res=;
  56. for(int i=;i<=n;i++) cur[i]=fir[i],c[d[i]]++;
  57. for(int x=s;d[x]<n;) {
  58. if(x==t) {
  59. res+=cal(s,t);
  60. x=s;
  61. }
  62. int ok=;
  63. for(int &i=cur[x];i;i=e[i].nxt)
  64. if(d[e[i].to]+==d[x]&&e[i].cap>e[i].flow){
  65. p[x=e[i].to]=i;
  66. ok=; break;
  67. }
  68. if(!ok) {
  69. cur[x]=fir[x]; int M=n;
  70. for(int i=cur[x];i;i=e[i].nxt)
  71. if(e[i].cap>e[i].flow)
  72. M=min(M,d[e[i].to]+);
  73. if(!(--c[d[x]])) break;
  74. c[d[x]=M]++;
  75. if(x!=s) x=e[p[x]].from;
  76. }
  77. }
  78. return res;
  79. }
  80. void work() {
  81. printf("%d\n",Maxflow(s,t));
  82. }
  83. int main()
  84. {
  85. init();
  86. work();
  87. return ;
  88. }

洛谷P3376【模板】网络最大流 ISAP的更多相关文章

  1. 【最大流ISAP】洛谷P3376模板题

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

  2. 洛谷.3254.圆桌问题(最大流ISAP)

    题目链接 日常水题 还是忍不住吐槽这题奇怪的评价 #include <cstdio> #include <cctype> #include <algorithm> ...

  3. P3376 [模板] 网络最大流

    https://www.luogu.org/blog/ONE-PIECE/wang-lao-liu-jiang-xie-zhi-dinic EK 292ms #include <bits/std ...

  4. [洛谷P3376题解]网络流(最大流)的实现算法讲解与代码

    [洛谷P3376题解]网络流(最大流)的实现算法讲解与代码 更坏的阅读体验 定义 对于给定的一个网络,有向图中每个的边权表示可以通过的最大流量.假设出发点S水流无限大,求水流到终点T后的最大流量. 起 ...

  5. 洛谷 P1546 最短网络 Agri-Net

    题目链接 https://www.luogu.org/problemnew/show/P1546 题目背景 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当 ...

  6. 洛谷P1546 最短网络 Agri-Net(最小生成树,Kruskal)

    洛谷P1546 最短网络 Agri-Net 最小生成树模板题. 直接使用 Kruskal 求解. 复杂度为 \(O(E\log E)\) . #include<stdio.h> #incl ...

  7. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

  8. 洛谷 P3376 【【模板】网络最大流】

    题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行包含三个正整数ui. ...

  9. 『题解』洛谷P3376 【模板】网络最大流

    Problem Portal Portal1:Luogu Description 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. Input 第一行包含四个正整数\(N,M,S,T\),分 ...

随机推荐

  1. Git及github使用(一)客户端与本地关联

    一.下载安装git客户端 1.官网下载地址:https://git-scm.com/ 2.选择自己相应的系统进行下载即可(windows一路默认安装) 二.配置git 1.在github上注册自己的账 ...

  2. 安装mongo

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_40101530/articl ...

  3. java执行spark查询hbase的jar包出现错误提示:ob aborted due to stage failure: Master removed our application: FAILED

    执行java调用scala 打包后的jar时候出现异常 /14 23:57:08 WARN TaskSchedulerImpl: Initial job has not accepted any re ...

  4. sklearn中模型评估和预测

    一.模型验证方法如下: 通过交叉验证得分:model_sleection.cross_val_score(estimator,X) 对每个输入数据点产生交叉验证估计:model_selection.c ...

  5. JavaScript 数组函数 map()

    JavaScript 数组函数 map() 学习心得 map()函数是一个数组函数: 它对数组每个原素进行操作,不对空数组进行操作: 不改变原本的数组,返回新数组: arr.map(function( ...

  6. vba增删改查数据库

    你在EXCEL中增加一个列名为ID,后在VBA中写以下代码,并引用Microsoft ActiveX Data Objects 2.8后执行Public Sub 写入SQL2008()Dim cnn ...

  7. MySQL - 锁等待超时与information_schema的三个表

    引用地址:https://blog.csdn.net/J080624/article/details/80596958 回顾一下生产中的一次MySQL异常,Cause: java.sql.SQLExc ...

  8. hibernate的核心思想

    Hibernate的核心思想是ROM对象关系映射机制.它是将表与表之间的操作映射成对象与对象之间的操作.也就是从数据库中提取的信息会自动按照你设置的映射要求封装成特定的对象.所以hibernate就是 ...

  9. USACO18FEB Platinum

    SlingShot 求数轴上从x到y的最短路( 边长为1),有若干个从xi到yi长度为ti的传送门,每次只能选择其中一个使用. 即求min(|x-y|,min{|a-x|+|b-y|+c}),拆开绝对 ...

  10. windows安装cygwin实现gcc/g++/linux操作等功能

    首先安装cygwin:参照下列博客去cygwin官网下载即可.安装过程中记得勾选需要的安装包,比如gcc/gdb https://blog.csdn.net/qilvmilv/article/deta ...