1. /*
  2. 唐代杜荀鹤
  3. 《小松》
  4. 自小刺头深草里,而今渐觉出蓬蒿。
  5. 时人不识凌云木,直待凌云始道高。
  6. */
  7. #include <iostream>
  8. #include <cstdio>
  9. #include <algorithm>
  10. #include <cstring>
  11. #include <vector>
  12. #include <utility>
  13. #include <iomanip>
  14. #include <string>
  15. #include <cmath>
  16. #include <queue>
  17. #include <assert.h>
  18. #include <map>
  19. #include <ctime>
  20. #include <cstdlib>
  21. #include <stack>
  22. #include <set>
  23. #define LOCAL
  24. const int INF = 0x7fffffff;
  25. const int MAXN = + ;
  26. const int maxnode = * + * ;
  27. const int MAXM = + ;
  28. const int MAX = ;
  29. using namespace std;
  30. struct Edge{
  31. int u, v, c, f;
  32. void init(int a, int b, int d, int e){
  33. u = a;v = b;
  34. c = d;f = e;
  35. }
  36. }edges[MAXM];
  37. int next[MAXN], M, cur[MAXN], vis[MAXN];
  38. int dist[MAXN], head[MAXN], n, m, sta, end;
  39.  
  40. void addEdge(int u, int v, int c){
  41. edges[M].init(u, v, c, );M++;
  42. edges[M].init(v, u, , );//反向边
  43. next[M - ] = head[u];
  44. head[u] = M - ;
  45. next[M] = head[v];
  46. head[v] = M++;
  47. return;
  48. }
  49. void init(){
  50. M = ;//总边数
  51. memset(head, -, sizeof(head));
  52. scanf("%d%d", &n, &m);
  53. for (int i = ; i <= m; i++){
  54. int u, v, c;
  55. scanf("%d%d%d", &u, &v, &c);
  56. addEdge(u, v, c);
  57. }
  58. sta = ;
  59. end = n;
  60. }
  61. bool bfs(){
  62. memset(vis, , sizeof(vis));
  63. queue<int>Q;
  64. dist[sta] = ;
  65. vis[sta] = ;
  66. Q.push(sta);
  67. while (!Q.empty()){
  68. int u = Q.front();
  69. Q.pop();
  70. for (int i = head[u]; i != -; i = next[i]){
  71. int e = i, v = edges[e].v;
  72. if (vis[v]) continue;
  73. if (edges[e].c > edges[e].f){
  74. vis[v] = ;
  75. dist[v] = dist[u] + ;
  76. Q.push(v);
  77. }
  78. }
  79. }
  80. return vis[end];
  81. }
  82. int dfs(int x, int a){
  83. if (x == end || a == ) return a;
  84. int flow = , f;
  85. if (cur[x] == -) cur[x] = head[x];
  86. for (int &i = cur[x]; i != -; i = next[i]){
  87. int e = i, v = edges[i].v;
  88. if (dist[v] == dist[x] + && (f = dfs(v, min(edges[e].c - edges[e].f, a))) > ){
  89. flow += f;
  90. a -= f;
  91. edges[e].f += f;
  92. edges[e ^ ].f -= f;
  93. if (a == ) break;
  94. }
  95. }
  96. return flow;
  97. }
  98. int Dinic(){
  99. int flow = ;
  100. while (bfs()){
  101. memset(cur, -, sizeof(cur));
  102. flow += dfs(sta, INF);
  103. }
  104. return flow;
  105. }
  106.  
  107. int main(){
  108. #ifdef LOCAL
  109. freopen("data.txt", "r", stdin);
  110. freopen("out.txt", "w", stdout);
  111. #endif
  112. init();
  113. printf("%d", Dinic());
  114. //printf("%d", (a == c));
  115. return ;
  116. }

【模板】【网络流】Dinic的更多相关文章

  1. 模板——网络流Dinic

    感谢这位大佬的博客:https://www.cnblogs.com/SYCstudio/p/7260613.html 给予了我莫大的帮助! 主要说一下网络流的几个注意点: 1.和二分图匹配相似,无法继 ...

  2. 模板-网络流-Dinic

    //Dinic struct Edge{ int from,to,cap,flow; Edge(){ } Edge(int a,int b,int c,int d){ from=a; to=b; ca ...

  3. POJ 1273 Drainage Ditches (网络流Dinic模板)

    Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover ...

  4. ACM/ICPC 之 有流量上下界的网络流-Dinic(可做模板)(POJ2396)

    //有流量上下界的网络流 //Time:47Ms Memory:1788K #include<iostream> #include<cstring> #include<c ...

  5. POJ 1273 Drainage Ditches(网络流dinic算法模板)

    POJ 1273给出M条边,N个点,求源点1到汇点N的最大流量. 本文主要就是附上dinic的模板,供以后参考. #include <iostream> #include <stdi ...

  6. POJ 3281 [网络流dinic算法模板]

    题意: 农场主有f种食物,d种饮料,n头牛. 接下来的n行每行第一个数代表第i头牛喜欢吃的食物数量,和第i头牛喜欢喝的饮料数目. 接下来分别是喜欢的食物和饮料的编号. 求解:农场主最多能保证几头牛同时 ...

  7. 网络流dinic ek模板 poj1273

    这里只是用来存放模板,几乎没有讲解,要看讲解网上应该很多吧…… ek bfs不停寻找增广路到找不到为止,找到终点时用pre回溯,O(VE^2) #include<cstdio> #incl ...

  8. Power Network POJ - 1459 网络流 DInic 模板

    #include<cstring> #include<cstdio> #define FOR(i,f_start,f_end) for(int i=f_startl;i< ...

  9. 网络流Dinic模板

    #include <iostream> #include <cstdio> #include <cstring> #include <queue> #d ...

  10. 网络流dinic模板,邻接矩阵+链式前向星

    //这个是邻接矩阵的#include<iostream> #include<queue> #include<string.h> #include<stdio. ...

随机推荐

  1. stand meeting

    “每日站立会议”.每日站立会议有一些具体的指导原则: 会议准时开始. (没有特殊情况10点开始) 欢迎所有人参加,但只允许有实际工作的团队成员发言. 不论团队规模大小,会议被限制在15分钟.(每个人2 ...

  2. ACM2096_小明A+B

    #include<iostream> int main() { using namespace std; int a,b,count; cin>>count; while(co ...

  3. Scrambled Polygon - POJ 2007(求凸包)

    给一些点,这些点都是一个凸包上的顶点,以第一个点为起点顺时针把别的点拍排一下序列. 分析:最简单的极坐标排序了..................... 代码如下: ----------------- ...

  4. Boxes - SGU 126(找规律)

    题目大意:有两个箱子,一个箱子装了A个球,一个箱子装了B个球,可以从球多的那个箱子拿出来球少的箱子里面球的总数放在少的那个箱子里面,问能否把球全部放在一个箱子里面? 分析:很容易求出来最后放的拿一下一 ...

  5. UVA 465 (13.08.02)

     Overflow  Write a program that reads an expression consisting of twonon-negative integer and an ope ...

  6. android的生命周期

    1.运行状态:当一个活动处于栈的顶部时,这时活动就处于活动状态,系统是不愿意回收处于活动状态的,会影响用户体验. 2.暂停状态:当一个活动不再处于栈的顶部时,但仍然可见时,这时就是暂停状态了.处于暂停 ...

  7. bzoj3673 bzoj3674可持久化并查集

    并查集都写不来了qwq 之前写的是错的 sz的初值都是0,这样怎么加就都是0了,水这道题还是可以,但是加强版就过不了了 #include<cstdio> #include<cstri ...

  8. Git服务器仓库的搭建和客户端使用方法

    环境说明: 1.fedora21  桌面系统  2.已经配置好yum仓库 一.安装git # yum install git 1.1 创建git用户 创建git账户并登录,直接指定用户目录到/home ...

  9. Qt 学习之路 :文件

    文件操作是应用程序必不可少的部分.Qt 作为一个通用开发库,提供了跨平台的文件操作能力.从本章开始,我们来了解下 Qt 的文件以及输入输出的功能,也就是 I/O 系统. Qt 通过QIODevice提 ...

  10. Qt 学习之路:Canvas

    在 QML 刚刚被引入到 Qt 4 的那段时间,人们往往在讨论 Qt Quick 是不是需要一个椭圆组件.由此,人们又联想到,是不是还需要其它的形状?这种没玩没了的联想导致了一个最直接的结果:除了圆角 ...