• 这是初学网络流的时候从《算法竞赛进阶指南》抄下来的一份代码,自己理解的也不是很透彻。
  • 注意,边要从 \(1\) 开始计,不然直接 \(xor\) 运算的话取反边会直接炸掉。
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. namespace Basic {
  4. template <typename Temp> inline void read(Temp & res) {
  5. Temp fh = 1; res = 0; char ch = getchar();
  6. for(; !isdigit(ch); ch = getchar()) if(ch == '-') fh = -1;
  7. for(; isdigit(ch); ch = getchar()) res = (res << 3) + (res << 1) + (ch ^ '0');
  8. res = res * fh;
  9. }
  10. template <typename Temp> inline void Checkmax(Temp & res, Temp comp) {if(comp > res) res = comp;}
  11. template <typename Temp> inline void Checkmin(Temp & res, Temp comp) {if(comp < res) res = comp;}
  12. }
  13. using namespace std;
  14. using namespace Basic;
  15. const int Maxn = 2e2 + 5;
  16. const int Maxm = 5e3 + 5;
  17. const int INF = 0x7fffffff >> 1;
  18. struct e {
  19. int to, nxt, flow;
  20. } b[Maxm << 1];
  21. int head[Maxn], ecnt = 1;
  22. inline void add(int u, int v, int f) {b[++ecnt] = (e){v, head[u], f}; head[u] = ecnt;}
  23. int depth[Maxn], curr[Maxn];
  24. int n, m, st, ed;
  25. int Max_flow, last_flow;
  26. queue<int> q;
  27. inline bool bfs() {
  28. memset(depth, 0, sizeof(depth));
  29. while(!q.empty()) q.pop();
  30. depth[st] = 1; q.push(st); curr[st] = head[st];
  31. while(!q.empty()) {
  32. int tnow = q.front(); q.pop();
  33. for(register int i = head[tnow]; i; i = b[i].nxt) {
  34. int tto = b[i].to, tw = b[i].flow;
  35. if((!tw) || (depth[tto])) continue;
  36. q.push(tto);
  37. depth[tto] = depth[tnow] + 1; curr[tto] = head[tto];
  38. if(tto == ed) return true;
  39. }
  40. }
  41. return false;
  42. }
  43. int dfs(int t, int Flow) {
  44. if(t == ed) return Flow;
  45. int rest = Flow, k, i;
  46. for(i = curr[t]; i && rest; i = b[i].nxt) {
  47. int tto = b[i].to, tw = b[i].flow; curr[t] = i;
  48. if((tw == 0) || (depth[tto] != depth[t] + 1)) continue;
  49. k = dfs(tto, min(rest, tw));
  50. rest -= k;
  51. b[i].flow -= k;
  52. b[i ^ 1].flow += k;
  53. if(!k) depth[tto] == 0;
  54. }
  55. return Flow - rest;
  56. }
  57. signed main() {
  58. read(n); read(m); read(st); read(ed);
  59. int x, y, z;
  60. while(m--) {
  61. read(x); read(y); read(z);
  62. add(x, y, z);
  63. add(y, x, 0);
  64. }
  65. while(bfs()) {
  66. /*
  67. for(register int i = 1; i <= n; ++i) {
  68. printf("%d ", depth[i]);
  69. }
  70. puts("");
  71. */
  72. while(last_flow = dfs(st, INF)) Max_flow += last_flow;
  73. }
  74. printf("%d", Max_flow);
  75. return 0;
  76. }

网络流 - dinic + 当前弧优化【代码】的更多相关文章

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

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

  2. [Poj2112][USACO2003 US OPEN] Optimal Milking [网络流,最大流][Dinic+当前弧优化]

    题意:有K个挤奶机编号1~K,有C只奶牛编号(K+1)~(C+K),每个挤奶机之多能挤M头牛,现在让奶牛走到挤奶机处,求奶牛所走的最长的一条边至少是多少. 题解:从起点向挤奶机连边,容量为M,从挤奶机 ...

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

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

  4. Dinic当前弧优化 模板及教程

    在阅读本文前,建议先自学最大流的Ek算法. 引入 Ek的核心是执行bfs,一旦找到增广路就停下来进行增广.换言之,执行一遍BFS执行一遍DFS,这使得效率大大降低.于是我们可以考虑优化. 核心思路 在 ...

  5. HDU 4280 Island Transport(dinic+当前弧优化)

    Island Transport Description In the vast waters far far away, there are many islands. People are liv ...

  6. 【Luogu】P1231教辅的组成(拆点+Dinic+当前弧优化)

    题目链接 妈耶 我的图建反了两次 准确的说是有两个地方建反了,然后反上加反改了一个小时…… 知道为什么要拆点吗? 假设这是你的图   左边到右边依次是超级源点    练习册     书     答案 ...

  7. 网络流小记(EK&dinic&当前弧优化&费用流)

    欢 迎 来 到 网 络 瘤 的 世 界 什么是网络流? 现在我们有一座水库,周围有n个村庄,每个村庄都需要水,所以会修水管(每个水管都有一定的容量,流过的水量不能超过容量).最终水一定会流向唯一一个废 ...

  8. 最大流加强 dinic+当前弧优化

    qyy开始练习网络流啦 , 啊 ,蒟蒻只会套版 ,很裸的题 , 我连题都不想发了 ,可以参考我的代码(虽然我也是看的别人的 #include <iostream> #include < ...

  9. 网络流SAP+gap+弧优化算法

    poj1273 Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 54962   Accept ...

随机推荐

  1. easyui中权限分配和添加 前后端代码

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  2. Qt学习笔记-Qt5和Qt4在音频方面的不同-QtAV

    之前学习qt4的时候,播放音频用的是phonon播放后端插件+mplayer. 今天改用qt5了.qt5中去掉了phonon模块加了multimedia.但是依然无法播放音乐,因为没有ffmpge s ...

  3. maven项目添加jar包

    使用集成工具创建一个maven项目,如果需要添加开发包,只需去maven仓库找到对应的包,将配置信息加入pom.xml文件即可.这样,我们就再也不用到处寻找和下载jar包了. 用例:开发工具 STS ...

  4. JavaDailyReports10_10

    1.4.2 键盘事件的处理 KeyListener  接口实现了处理键盘事件      KeyEvent 对象描述键盘事件的相关信息. KeyListener 接口有三个方法:KeyPressed K ...

  5. SpringBoot+Prometheus+Grafana实现应用监控和报警

    一.背景 SpringBoot的应用监控方案比较多,SpringBoot+Prometheus+Grafana是目前比较常用的方案之一.它们三者之间的关系大概如下图: 关系图 二.开发SpringBo ...

  6. [Skill] 记一次vue项目热更新失败案例

    病因 修改文件后无法更新界面,感觉留白,没有更新 解决过程 发现问题,第一步搜索别人是怎么解决的 搜索一阵后,发现大部分都是留言路径问题,基本都是组件文件夹大写导致 修改测试后发现问题依旧 然后仔细观 ...

  7. filleSystemBasises

    基本查询命令 pwd 查看当前目录 dir 显示当前目录下的文件信息 more 查看文本文件的具体内容 cd 修改用户当前目录 mkdir 创建新的目录 rmdir 删除目录 copy filenam ...

  8. NOIP初赛篇——09原码、反码和补码

    一.数的原码.补码和反码表示 机器数和真值 ​ 在计算机中,表示数值的数字符号只有0和1两个数码,我们规定最高位为符号位,并用0表示正符号,用1表示负符号.这样,机器中的数值和符号全"数码化 ...

  9. Lambda获取类属性的名字

    using System; using System.ComponentModel; using System.Linq.Expressions; using System.Reflection; p ...

  10. navicat for mysql 破解版

    Navicat for MySQL下载地址:Navicat for MySQL 软件和破解程序 第1步.安装Navicat软件,最后点击完成 第2步.安装成功之后还要进行破解.点击patchNavic ...