今天学了网络最大流,EK 和 Dinic 主要就是运用搜索求增广路,Dinic 相当于 EK 的优化,先用bfs求每个点的层数,再用dfs寻找并更新那条路径上的值。

EK 算法

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<queue>
  6. #define maxn 1000001
  7. #define INF 2147483647
  8. using namespace std;
  9. int cnt=,head[maxn];
  10. int dis[maxn],vis[maxn],flow[maxn],last[maxn],maxflow;
  11. struct node
  12. {
  13. int u,v,w,nex;
  14. }edge[maxn];
  15. queue<int>q;
  16. int S,T,n,m;
  17. inline int read()
  18. {
  19. int x=;
  20. bool f=;
  21. char c=getchar();
  22. for(; !isdigit(c); c=getchar()) if(c=='-') f=;
  23. for(; isdigit(c); c=getchar()) x=(x<<)+(x<<)+c-'';
  24. if(f) return x;
  25. return -x;
  26. }
  27. inline void add(int x,int y,int z)
  28. {
  29. cnt++;
  30. edge[cnt].u=x;
  31. edge[cnt].v=y;
  32. edge[cnt].w=z;
  33. edge[cnt].nex=head[x];
  34. head[x]=cnt;
  35. }
  36. inline bool bfs(int S,int T)
  37. {
  38. for(int i=;i<=n;i++)
  39. {
  40. last[i]=;
  41. vis[i]=-;
  42. }
  43. q.push(S);
  44. dis[S]=;
  45. vis[S]=;
  46. flow[S]=INF;
  47. while(!q.empty())
  48. {
  49. int u=q.front();
  50. q.pop();
  51. vis[u]=;
  52. for(int i=head[u];i!=-;i=edge[i].nex)
  53. {
  54. int v=edge[i].v;
  55. if(edge[i].w>&&vis[v]==-)
  56. {
  57. flow[v]=min(flow[u],edge[i].w);
  58. last[v]=i;
  59. q.push(v);
  60. vis[v]=;
  61. }
  62. }
  63. }
  64. if(vis[T]!=-)return true;
  65. return false;
  66. }
  67. inline void update(int S,int T)
  68. {
  69. int now=T;
  70. while(now!=S)
  71. {
  72. int i=last[now];
  73. edge[i].w-=flow[T];
  74. edge[i^].w+=flow[T];
  75. now=edge[i].u;
  76. }
  77. maxflow+=flow[T];
  78. }
  79. inline void EK()
  80. {
  81.  
  82. maxflow=;
  83. while(bfs(S,T)==true)
  84. {
  85. update(S,T);
  86. }
  87. }
  88. int main()
  89. {
  90. memset(head,-,sizeof(head));
  91. n=read();m=read();S=read();T=read();
  92. for(int i=;i<=m;i++)
  93. {
  94. int x,y,z;
  95. x=read();y=read();z=read();
  96. add(x,y,z);add(y,x,);
  97. }
  98. EK();
  99. printf("%d",maxflow);
  100. return ;
  101. }

Dinic 算法

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<queue>
  6. #define maxn 1000001
  7. #define INF 2147483647
  8. using namespace std;
  9. int cnt=,head[maxn],level[maxn];
  10. struct node
  11. {
  12. int u,v,w,nex;
  13. }edge[maxn];
  14. queue<int> q;
  15. int S,T,n,m;
  16. inline int read()
  17. {
  18. int x=;
  19. bool f=;
  20. char c=getchar();
  21. for(; !isdigit(c); c=getchar()) if(c=='-') f=;
  22. for(; isdigit(c); c=getchar()) x=(x<<)+(x<<)+c-'';
  23. if(f) return x;
  24. return -x;
  25. }
  26. inline void write(int x)
  27. {
  28. if(x<){putchar('-');x=-x;}
  29. if(x>)write(x/);
  30. putchar(x%+'');
  31. }
  32. inline void add(int x,int y,int z)
  33. {
  34. cnt++;
  35. edge[cnt].u=x;
  36. edge[cnt].v=y;
  37. edge[cnt].w=z;
  38. edge[cnt].nex=head[x];
  39. head[x]=cnt;
  40. }
  41. inline bool bfs()
  42. {
  43. memset(level,-,sizeof(level));
  44. level[S]=;
  45. q.push(S);
  46. while(!q.empty())
  47. {
  48. int from=q.front();
  49. q.pop();
  50. for(int i=head[from];i!=-;i=edge[i].nex)
  51. {
  52. int to=edge[i].v;
  53. if(edge[i].w>&&level[to]==-)
  54. {
  55. level[to]=level[from]+;
  56. q.push(to);
  57. }
  58. }
  59. }
  60. if(level[T]!=-)return true;
  61. return false;
  62. }
  63. inline int dfs(int u,int flow)
  64. {
  65. if(u==T)return flow;
  66. int ret=flow;
  67. for(int i=head[u];i!=-;i=edge[i].nex)
  68. {
  69. if(ret<=)break;
  70. int to=edge[i].v;
  71. if(edge[i].w>&&level[u]+==level[to])
  72. {
  73. int k=dfs(to,min(edge[i].w,ret));
  74. ret-=k;
  75. edge[i].w-=k;
  76. edge[i^].w+=k;
  77. }
  78. }
  79. return flow-ret;
  80. }
  81. inline int dinic()
  82. {
  83. int ans=;
  84. while(bfs()==true)ans+=dfs(S,INF);
  85. return ans;
  86. }
  87. int main()
  88. {
  89. memset(head,-,sizeof(head));
  90. n=read();m=read();S=read();T=read();
  91. for(int i=;i<=m;i++)
  92. {
  93. int x,y,z;
  94. x=read();y=read();z=read();
  95. add(x,y,z);
  96. add(y,x,);
  97. }
  98. int res=dinic();
  99. write(res);
  100. return ;
  101. }
  1. 请各位大佬斧正(反正我不认识斧正是什么意思)

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

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

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

  2. 洛谷 P2038 无线网络发射器选址 题解

    每日一题 day9 打卡 Analysis 这道题是个模拟,两个0~128( 注意不是1~128 )的循环枚举正方形中心点,判断正方形的边界,再用循环枚举公共场所的数量就好了. 时间复杂度 < ...

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

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

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

    这篇博客写得非常好呀. 传送门 于是我是DCOI这一届第一个网络流写ISAP的人了,之后不用再被YKK她们嘲笑我用Dinic了!就是这样! 感觉ISAP是会比Dinic快,只分一次层,然后不能增广了再 ...

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

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

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

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

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

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

  8. 洛谷P1854 花店橱窗布置 分析+题解代码

    洛谷P1854 花店橱窗布置 分析+题解代码 蒟蒻的第一道提高+/省选-,纪念一下. 题目描述: 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定 ...

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

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

  10. HAOI2006 (洛谷P2341)受欢迎的牛 题解

    HAOI2006 (洛谷P2341)受欢迎的牛 题解 题目描述 友情链接原题 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之 ...

随机推荐

  1. Python进阶:并发编程之Asyncio

    什么是Asyncio 多线程有诸多优点且应用广泛,但也存在一定的局限性: 比如,多线程运行过程容易被打断,因此有可能出现 race condition 的情况:再如,线程切换本身存在一定的损耗,线程数 ...

  2. Source Insight 4.0相对路径的设置

    比如在D盘有个51的Firmware工程 里面有几个文件夹存放程序文件,项目文件在Project文件夹里,也就是整个Firmware里的文件都是有用的. Keil项目文件位置. 到这里就可以双击Tem ...

  3. SQL注入获取Sa账号密码

    漏洞位置:http://168.1.1.81/Information/Search?Keyword=1111 漏洞利用: MSSQL 2000 http://168.1.1.81/Informatio ...

  4. Drools7 Hello Wrold 入门详细步骤--系列01课

    一.什么叫规则引擎?规则--->写在文档上引擎--->在java代码上,引用这个文档上的规则 二.drools规则引擎有什么用?简单来说就是将多变的规则,从业务代码中剥离出来(当规则变了之 ...

  5. Linux 服务器 关闭FTP匿名访问

    service vsftpd status //查看FTP运行状态 vim /etc/vsftpd/vsftpd.conf //修改配置文件 找到vsftpd.conf中的 anonymous_ena ...

  6. $(...).wordExport is not a function

     参考网址:https://laod.cn/code-audit/jquery-is-not-a-function.html 问题描述: 1.view页面引用的是jquery-1.10.2.min.j ...

  7. pandas-11 TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely错误解决方法

    pandas-11 TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be sa ...

  8. 【强烈推荐】ok-admin 一个好看又好用的后台模版!!!

    ok-admin 一个很赞的,扁平化风格的,响应式布局的后台管理模版,旨为后端程序员减压! 目前一共有两个版本:ok-admin v1.0和ok-admin v2.0可自由选择! 源码地址:https ...

  9. 关于创建Web图像时应记住的五个要素

    1. 格式与下载速度 当前,Web上用的最广泛的三种格式是GIF.PNG和JPEG.我们的目标是选择质量最高,同时文件最小的格式. WebP图像格式 谷歌建立了另一种图像格式,名为WebP. 这种格式 ...

  10. 【转】Flex 布局教程:语法篇

    作者: 阮一峰 日期: 2015年7月10日 网页布局(layout)是 CSS 的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + floa ...