题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3549

题意:

给你一个有向图,问你1到n的最大流。

dinic模版 (n*n*m)

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. using namespace std;
  5. const int N = ; //点个数
  6. const int M = ; //边个数
  7. const int inf = 0x3f3f3f3f;
  8. struct Edge {
  9. int to, next, cap, flow;
  10. }edge[M];
  11. int tot, head[N];
  12. void init() {
  13. tot = 0;
  14. memset(head, -, sizeof(head));
  15. }
  16. inline void add(int u, int v, int w, int rw = ) {
  17. edge[tot].to = v; edge[tot].cap = w; edge[tot].flow = ;
  18. edge[tot].next = head[u]; head[u] = tot++;
  19. edge[tot].to = u; edge[tot].cap = rw; edge[tot].flow = ;
  20. edge[tot].next = head[v]; head[v] = tot++;
  21. }
  22. int Q[N];
  23. int dep[N], cur[N], sta[N];
  24. bool bfs(int s, int t, int n) {
  25. int front = , tail = ;
  26. memset(dep, -, sizeof(dep[])*(n + ));
  27. dep[s] = ;
  28. Q[tail++] = s;
  29. while(front < tail) {
  30. int u = Q[front++];
  31. for(int i = head[u]; ~i; i = edge[i].next) {
  32. int v = edge[i].to;
  33. if(edge[i].cap > edge[i].flow && dep[v] == -) {
  34. dep[v] = dep[u] + ;
  35. if(v == t)
  36. return true;
  37. Q[tail++] = v;
  38. }
  39. }
  40. }
  41. return false;
  42. }
  43.  
  44. int dinic(int s, int t, int n) {
  45. int maxflow = ;
  46. while(bfs(s, t, n)) {
  47. for(int i = ; i < n; ++i)
  48. cur[i] = head[i];
  49. int u = s, tail = ;
  50. while(cur[s] != -) {
  51. if(u == t) {
  52. int tp = inf;
  53. for(int i = tail - ; i >= ; --i) {
  54. tp = min(tp, edge[sta[i]].cap - edge[sta[i]].flow);
  55. }
  56. maxflow += tp;
  57. for(int i = tail - ; i >= ; --i) {
  58. edge[sta[i]].flow += tp;
  59. edge[sta[i] ^ ].flow -= tp;
  60. if(edge[sta[i]].cap - edge[sta[i]].flow == )
  61. tail = i;
  62. }
  63. u = edge[sta[tail] ^ ].to;
  64. } else if(cur[u] != - && edge[cur[u]].cap > edge[cur[u]].flow && dep[u] + == dep[edge[cur[u]].to]) {
  65. sta[tail++] = cur[u];
  66. u = edge[cur[u]].to;
  67. } else {
  68. while(u != s && cur[u] == -) {
  69. u = edge[sta[--tail] ^ ].to;
  70. }
  71. cur[u] = edge[cur[u]].next;
  72. }
  73. }
  74. }
  75. return maxflow;
  76. }
  77.  
  78. int main()
  79. {
  80. int t, n, m, u, v, c;
  81. scanf("%d", &t);
  82. for(int ca = ; ca <= t; ++ca) {
  83. scanf("%d %d", &n, &m);
  84. init();
  85. for(int i = ; i <= m; ++i) {
  86. scanf("%d %d %d", &u, &v, &c);
  87. add(u, v, c);
  88. }
  89. printf("Case %d: %d\n", ca, dinic(, n, n));
  90. }
  91. return ;
  92. }

貌似一般比dinic更优一点

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. using namespace std;
  5. const int N = 1e3 + ;
  6. const int M = 1e4 + ;
  7. const int inf = 0x3f3f3f3f;
  8. struct Edge {
  9. int to, next, cap, flow;
  10. }edge[M];
  11. int tot, head[N], gap[N], dep[N], cur[N];
  12. void init() {
  13. tot = ;
  14. memset(head, -, sizeof(head));
  15. }
  16. void addedge(int u, int v, int w, int rw = ) {
  17. edge[tot].next = head[u]; edge[tot].to = v; edge[tot].cap = w; edge[tot].flow = ; head[u] = tot++;
  18. edge[tot].next = head[v]; edge[tot].to = u; edge[tot].cap = rw; edge[tot].flow = ; head[v] = tot++;
  19. }
  20. int Q[N];
  21. void bfs(int start, int end) {
  22. memset(dep, -, sizeof(dep));
  23. memset(gap, , sizeof(gap));
  24. gap[] = ;
  25. int front = , rear = ;
  26. dep[end] = ;
  27. Q[rear++] = end;
  28. while(front != rear) {
  29. int u = Q[front++];
  30. for(int i = head[u]; ~i; i = edge[i].next) {
  31. int v = edge[i].to;
  32. if(dep[v] != -)
  33. continue;
  34. Q[rear++] = v;
  35. dep[v] = dep[u] + ;
  36. gap[dep[v]]++;
  37. }
  38. }
  39. }
  40. int S[N];
  41. int sap(int start, int end, int N) {
  42. bfs(start, end);
  43. memcpy(cur, head, sizeof(head));
  44. int top = ;
  45. int u = start;
  46. int ans = ;
  47. while(dep[start] < N) {
  48. if(u == end) {
  49. int Min = inf;
  50. int inser;
  51. for(int i = ; i < top; ++i) {
  52. if(Min > edge[S[i]].cap - edge[S[i]].flow) {
  53. Min = edge[S[i]].cap - edge[S[i]].flow;
  54. inser = i;
  55. }
  56. }
  57. for(int i = ; i < top; ++i) {
  58. edge[S[i]].flow += Min;
  59. edge[S[i] ^ ].flow -= Min;
  60. }
  61. ans += Min;
  62. top = inser;
  63. u = edge[S[top] ^ ].to;
  64. continue;
  65. }
  66. bool flag = false;
  67. int v;
  68. for(int i = cur[u]; ~i; i = edge[i].next) {
  69. v = edge[i].to;
  70. if(edge[i].cap - edge[i].flow && dep[v] + == dep[u]) {
  71. flag = true;
  72. cur[u] = i;
  73. break;
  74. }
  75. }
  76. if(flag) {
  77. S[top++] = cur[u];
  78. u = v;
  79. continue;
  80. }
  81. int Min = N;
  82. for(int i = head[u]; ~i; i = edge[i].next) {
  83. if(edge[i].cap - edge[i].flow && dep[edge[i].to] < Min) {
  84. Min = dep[edge[i].to];
  85. cur[u] = i;
  86. }
  87. }
  88. gap[dep[u]]--;
  89. if(!gap[dep[u]])
  90. return ans;
  91. dep[u] = Min + ;
  92. gap[dep[u]]++;
  93. if(u != start)
  94. u = edge[S[--top] ^ ].to;
  95. }
  96. return ans;
  97. }
  98.  
  99. int main()
  100. {
  101. int t, n, m, u, v, c;
  102. scanf("%d", &t);
  103. for(int ca = ; ca <= t; ++ca) {
  104. scanf("%d %d", &n, &m);
  105. init();
  106. for(int i = ; i < m; ++i) {
  107. scanf("%d %d %d", &u, &v, &c);
  108. addedge(u, v, c);
  109. }
  110. printf("Case %d: %d\n", ca, sap(, n, n));
  111. }
  112. return ;
  113. }

HDU 3549 Flow Problem (dinic模版 && isap模版)的更多相关文章

  1. hdu 3549 Flow Problem (Dinic)

    Flow ProblemTime Limit: 5000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  2. HDU 3549 Flow Problem(最大流)

    HDU 3549 Flow Problem(最大流) Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/ ...

  3. 网络流 HDU 3549 Flow Problem

    网络流 HDU 3549 Flow Problem 题目:pid=3549">http://acm.hdu.edu.cn/showproblem.php?pid=3549 用增广路算法 ...

  4. hdu 3549 Flow Problem

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=3549 Flow Problem Description Network flow is a well- ...

  5. hdu 3549 Flow Problem【最大流增广路入门模板题】

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3549 Flow Problem Time Limit: 5000/5000 MS (Java/Others ...

  6. HDU 3549 Flow Problem (最大流ISAP)

    Flow Problem Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tota ...

  7. 网络流--最大流--HDU 3549 Flow Problem

    题目链接 Problem Description Network flow is a well-known difficult problem for ACMers. Given a graph, y ...

  8. hdu 3549 Flow Problem Edmonds_Karp算法求解最大流

    Flow Problem 题意:N个顶点M条边,(2 <= N <= 15, 0 <= M <= 1000)问从1到N的最大流量为多少? 分析:直接使用Edmonds_Karp ...

  9. HDU 3549 Flow Problem 网络流(最大流) FF EK

    Flow Problem Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Tot ...

随机推荐

  1. “帮你APP”团队冲刺1

    1.整个项目预期的任务量 (任务量 = 所有工作的预期时间)和 目前已经花的时间 (所有记录的 ‘已经花费的时间’),还剩余的时间(所有工作的 ‘剩余时间’) : 所有工作的预期时间:88h 目前已经 ...

  2. Nodejs-文件流

    1.什么是流? 流是程序输入输出的一个连续的字节序列. 有文件流,网络流,设备(例如鼠标,键盘,磁盘,调制解调器和打印机)的输入输出都是用流来处理的. 任何数据的最根本表现形式都是二进制. 读取文件 ...

  3. Mac OS 添加 MySQL 环境变量

    1.打开终端,输入: cd ~ 会进入~文件夹 2.如果 ~ 文件夹中已经存在 .bash_profile 文件,则在 : 后面追加你想要添加的路径, 3. 否则输入:touch .bash_prof ...

  4. Struts2请求流程

    1. 一个请求在Struts2框架中的处理步骤: a) 客户端初始化一个指向Servlet容器的请求: b) 根据Web.xml配置,请求首先经过ActionContextCleanUp过滤器,其为可 ...

  5. vivo和OPPO手机刷机

    vivo和OPPO手机是蓝绿两厂,定位年轻时尚女士,比较注重拍照和听音乐,其他无视. 系统很少更新,Root和刷机也比较困难,建议是直接卡刷. 小米手机耍猴(猴子精,代指懂点手机的人) 蓝绿两厂是耍猪 ...

  6. 基于jQuery的插件

    jQuery Validation 验证框架 jQuery Form Ajax表单插件 jQuery UI插件 Easy UI

  7. Markdown语法图解

    Markdown语法图解 文章目录 快捷键 基本语法 对字体设置斜体.粗体.删除线 分级标题 链接 分割线 代码块 引用 列表 表格 常用技巧 换行 缩进字符 如何打出一些特殊符号 字体.字号与颜色 ...

  8. BZOJ3129 [Sdoi2013]方程 【扩展Lucas】

    题目 给定方程 X1+X2+. +Xn=M 我们对第l..N1个变量进行一些限制: Xl < = A X2 < = A2 Xn1 < = An1 我们对第n1 + 1..n1+n2个 ...

  9. 七牛云的cdn配置

    https://segmentfault.com/q/1010000004265556

  10. ReactJS 学习路线

    Node.js: 推荐采用nvm的方式安装,nvm(Node Version Manager)用于Node的版本管理,方便不同版本的Node之间的切换 安装npm,npm(Node Package M ...