最大流模板:

  • 普通最大流
  • 无向图限制:将无向图的边拆成2条方向相反的有向边
  • 顶点有流量限制:拆成2个点,连接一条容量为点容量限制的边
  • 无源汇点有最小流限制的最大流:理解为水管流量形成循环
  • 有源汇点的最小流限制的最大流
  • 有源汇点的最小流限制的最小流
  • 容量为负数:不能直接利用最大流求边权为负数的最小割。不知道怎么具体处理。。。

模板使用Dinic分层算法,使用了当前弧优化,效率还是不错的,使用的是vector存图,如果使用邻接表存图效率应该会更高吧。

但是ispa算法的效率更高,采用了当前弧优化的ispa算法那就更更高的效率了(=^ ^=),但是这个算法目前不会啊。。。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<algorithm>
  6. #include<set>
  7. #include<map>
  8. #include<queue>
  9. #include<stack>
  10. #include<vector>
  11. using namespace std;
  12. typedef long long ll;
  13. typedef pair<int,int> P;
  14. #define PI acos(-1.0)
  15. const int maxn=1e5+,maxm=1e5+,inf=0x3f3f3f3f,mod=1e9+;
  16. const ll INF=1e18+;
  17. struct edge
  18. {
  19. int from,to,cap,flow;
  20. };
  21. vector<edge>es;
  22. vector<int>G[maxn];
  23. bool vis[maxn];
  24. int dist[maxn];
  25. int iter[maxn];
  26. void init(int n)
  27. {
  28. for(int i=; i<=n+; i++) G[i].clear();
  29. es.clear();
  30. }
  31. void addedge(int from,int to,int cap)
  32. {
  33. es.push_back((edge)
  34. {
  35. from,to,cap,
  36. });
  37. es.push_back((edge)
  38. {
  39. to,from,,
  40. });
  41. int x=es.size();
  42. G[from].push_back(x-);
  43. G[to].push_back(x-);
  44. }
  45. bool BFS(int s,int t)
  46. {
  47. memset(vis,,sizeof(vis));
  48. queue <int> Q;
  49. vis[s]=;
  50. dist[s]=;
  51. Q.push(s);
  52. while(!Q.empty())
  53. {
  54. int u=Q.front();
  55. Q.pop();
  56. for (int i=; i<G[u].size(); i++)
  57. {
  58. edge &e=es[G[u][i]];
  59. if (!vis[e.to]&&e.cap>e.flow)
  60. {
  61. vis[e.to]=;
  62. dist[e.to]=dist[u]+;
  63. Q.push(e.to);
  64. }
  65. }
  66. }
  67. return vis[t];
  68. }
  69. int DFS(int u,int t,int f)
  70. {
  71. if(u==t||f==) return f;
  72. int flow=,d;
  73. for(int &i=iter[u]; i<G[u].size(); i++)
  74. {
  75. edge &e=es[G[u][i]];
  76. if(dist[u]+==dist[e.to]&&(d=DFS(e.to,t,min(f,e.cap-e.flow)))>)
  77. {
  78. e.flow+=d;
  79. es[G[u][i]^].flow-=d;
  80. flow+=d;
  81. f-=d;
  82. if (f==) break;
  83. }
  84. }
  85. return flow;
  86. }
  87. int Maxflow(int s,int t)
  88. {
  89. int flow=;
  90. while(BFS(s,t))
  91. {
  92. memset(iter,,sizeof(iter));
  93. int d=;
  94. while(d=DFS(s,t,inf)) flow+=d;
  95. }
  96. return flow;
  97. }
  98.  
  99. int in[maxn],out[maxn];
  100. int l[maxn];
  101. int main()
  102. {
  103. int n,m;
  104. scanf("%d%d",&n,&m);
  105.  
  106. /**有源汇点*/
  107. int s,t;
  108. scanf("%d%d",&s,&t);
  109.  
  110. memset(in,,sizeof(in));
  111. memset(out,,sizeof(out));
  112. init(n);
  113. for (int i=; i<=m; i++)
  114. {
  115. int u,v,r;
  116. scanf("%d %d %d %d",&u,&v,&l[i],&r);
  117. out[u]+=l[i],in[v]+=l[i];
  118. addedge(u,v,r-l[i]);
  119. }
  120.  
  121. /**有源汇点有下界*/
  122. addedge(t,s,inf);
  123.  
  124. /**有下界添加新源点0,汇点n+1*/
  125. int ss=,tt=n+;
  126. int sum=;
  127. for(int i=; i<=n; i++)
  128. {
  129. if(in[i]>out[i])
  130. {
  131. addedge(ss,i,in[i]-out[i]);
  132. sum+=in[i]-out[i];
  133. }
  134. else if(in[i]<out[i])
  135. addedge(i,tt,out[i]-in[i]);
  136. }
  137.  
  138. /**无下界直接用s,t求最大流*/
  139. if(Maxflow(ss,tt)!=sum) puts("NO");
  140. else
  141. {
  142. puts("YES");
  143.  
  144. /**有源汇点*/
  145. int ans=-es[*m+].flow;
  146. es[*m+].flow=;
  147. es[*m].flow=;
  148. es[*m].cap=;
  149. ans+=Maxflow(s,t);///ans-=Maxflow(t,s);///最小流
  150. printf("%d\n",ans);
  151.  
  152. /**无源汇点:可以理解成水管形成循环*/
  153. for(int i=; i<m*; i+=)
  154. printf("%d\n",es[i].flow+l[i/+]);///每根水管的流量情况
  155. }
  156. return ;
  157. }

最大流当前弧优化Dinic模板的更多相关文章

  1. 最大流当前弧优化Dinic分层模板

    最大流模板: 普通最大流 无向图限制:将无向图的边拆成2条方向相反的有向边 顶点有流量限制:拆成2个点,连接一条容量为点容量限制的边 无源汇点有最小流限制的最大流:理解为水管流量形成循环 有源汇点的最 ...

  2. zkw费用流+当前弧优化

    zkw费用流+当前弧优化 var o,v:..] of boolean; f,s,d,dis:..] of longint; next,p,c,w:..] of longint; i,j,k,l,y, ...

  3. 解题报告:hdu 3572 Task Schedule(当前弧优化Dinic算法)

    Problem Description Our geometry princess XMM has stoped her study in computational geometry to conc ...

  4. P3355 骑士共存问题 二分建图 + 当前弧优化dinic

    P3355 骑士共存问题 题意: 也是一个棋盘,规则是“马”不能相互打到. 思路: 奇偶点分开,二分图建图,这道题要注意每个点可以跑八个方向,两边都可以跑,所以边 = 20 * n * n. 然后di ...

  5. BZOJ-2756 奇怪的游戏 黑白染色+最大流+当前弧优化+二分判断+分类讨论

    这个题的数据,太卡了,TLE了两晚上,各种调试优化,各种蛋疼. 2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MB Submit ...

  6. P3376 网络流-最大流模板题(Dinic+当前弧优化)

    (点击此处查看原题) Dinic算法 Dinic算法相对于EK算法,主要区别在于Dinic算法对图实现了分层,使得我们可以用一次bfs,一次dfs使得多条增广路得到增广 普通的Dinic算法已经可以处 ...

  7. P3376 网络最大流模板(Dinic + dfs多路增广优化 + 炸点优化 + 当前弧优化)

    ### P3376 题目链接 ### 这里讲一下三种优化的实现以及正确性. 1.dfs多路增广优化 一般的Dinic算法中是这样的,bfs() 用于标记多条增广路,以至于能一次 bfs() 出多次 d ...

  8. 网络流--最大流--Dinic模板矩阵版(当前弧优化+非当前弧优化)

    //非当前弧优化版 #include <iostream> #include <cstdio> #include <math.h> #include <cst ...

  9. ARC085E(最小割规划【最大流】,Dinic当前弧优化)

    #include<bits/stdc++.h>using namespace std;typedef long long ll;const ll inf=0x3f3f3f3f;int cn ...

随机推荐

  1. js中的数组对象排序(方法sort()详细介绍)

    定义和用法 sort() 方法用于对数组的元素进行排序. 语法    arrayObject.sort(sortby) 参数sortby:可选.规定排序顺序.必须是函数. 返回值 对数组的引用.请注意 ...

  2. redhat 6.8 配置centos6的yum源

    1. 检查是否安装yum包[root@node1 rpms]# rpm -qa|grep yum 2. 删除自带的yum包[root@node1 rpms]# rpm -qa|grep yum|xar ...

  3. Linux中samba服务器的搭建

    使用的vmware12虚拟机安装的centos6.8和物理机上的windows10,实现在windows10 上访问CentOs上的samba服务. 一.先查看系统中是否安装有samba服务相关的软件 ...

  4. 为Windows资源管理器右键菜单添加菜单项

    为Windows资源管理器右键菜单添加菜单项 在Windows下命令行用的比较多,经常在资源管理器里翻到某个目录,若想要在此目录下跑命令,只能是打开cmd.exe,然后一路cd才能到达此目录. 每次都 ...

  5. vue setTimeout用法 jquery滚动到某一个div的底部

    //vue 中setTimeOut用法 var $this = this; setTimeout(function(){ $this.goEnd() }, 10); goEnd:function(){ ...

  6. Java注解--实现动态数据源切换

    当一个项目中有多个数据源(也可以是主从库)的时候,我们可以利用注解在mapper接口上标注数据源,从而来实现多个数据源在运行时的动态切换. 实现原理 在Spring 2.0.1中引入了Abstract ...

  7. java执行程序的内存分析系列专栏二之static变量和方法内存分析

    昨天写了简单的聊了下java执行程序时简单的内存划分,今天我们接着往下聊,聊聊static变量和方法的内存分析. 1.static变量和方法的第一个特性内存分析 statiic变量和方法的第一个特性能 ...

  8. 配置SSH无秘钥登录

    [hadoop@hadoop01 ~]$ cd .ssh [hadoop@hadoop01 .ssh]$ ls authorized_keys id_rsa id_rsa.pub known_host ...

  9. visual studio for mac在线安装网络错误

    vs2017 for mac 终于出正式版了,兴冲冲的准备摆脱虚拟机. 官网https://www.visualstudio.com/zh-hans/vs/visual-studio-mac/下了安装 ...

  10. VMware Mac OS中无法找到适应的分辨率的解决办法

    使用VMware安装的Mac OS中,有时在显示器的分辨率中的选择项里面,没有对应显示的分辨率可供选择的时候(无法自适应),可以在虚拟机设置里,显示器中修改强制分辨率.修改过后重启虚拟机,就可以有对应 ...