题目链接:排水沟

题意:现有n个排水沟和m个点(其中1是源点,m是汇点),给定n个排水沟所连接的点,求从源点到汇点的最大流量。

【EK解法】

  1. #include <algorithm>
  2. #include <queue>
  3. #include <string.h>
  4. using namespace std;
  5. int const MAX = ;
  6. int const inf = 0x3f3f3f3f;
  7. int c[MAX][MAX];//c[u][v]保存容量
  8. int f[MAX][MAX];//f[u][v]保存当前流量
  9. int a[MAX];// a数组在每趟bfs中找到最小路径中最小残余流量的,a数组使个递推数组,a[v]的意思是从源点s到点v的最小残余流量
  10. int p[MAX];//保存前一个点
  11. int n, m;
  12. int bfs(int s, int t)
  13. {
  14. queue<int> q;
  15. int flow = ;
  16. while(!q.empty()) q.pop();
  17. memset(f, , sizeof(f));
  18. while(){
  19. memset(a, , sizeof(a));
  20. a[s] = inf;//将起始点的最小残余量设为最大
  21. q.push(s);
  22. while(!q.empty()){//bfs找到一条最短路,这里的边不代表距离,可以看作每两个点都是单位距离的
  23. int u;
  24. u = q.front();
  25. q.pop();
  26. for(int v = ; v <= m; v++){//枚举所有点v <u,v>
  27. if(!a[v] && c[u][v] > f[u][v]){//a[]可以代替vis[],来判断这个点是否已经遍历过,后面那个条件更是起了关键作用,很巧妙
  28. p[v] = u;
  29. q.push(v);
  30. a[v] = min(a[u], c[u][v] - f[u][v]);//递推
  31. }
  32. }
  33. }
  34. if(!a[t]) break;//直到最小残余流量为0时,退出
  35. for(int u = t; u != s; u = p[u]){
  36. f[p[u]][u] += a[t];
  37. f[u][p[u]] -= a[t];
  38. }
  39. flow += a[t];
  40. }
  41. return flow;
  42. }
  43.  
  44. int main()
  45. {
  46. while(~scanf("%d %d", &n, &m)){
  47. memset(c, , sizeof(c));
  48. memset(p, , sizeof(p));
  49. for(int i = ; i <= n; i++){
  50. int u, v, w;
  51. scanf("%d %d %d", &u, &v, &w);
  52. c[u][v] += w;
  53. }
  54. printf("%d\n", bfs(, m));
  55. }
  56. return ;
  57. }

EK解法

【Dinic解法】

  1. #include <cstdio>
  2. #include <string.h>
  3. #include <queue>
  4. using namespace std;
  5. int const inf = 0x3f3f3f3f;
  6. int const MAX = ;
  7. int n, m;
  8. int c[MAX][MAX], dep[MAX];//dep[MAX]代表当前层数
  9.  
  10. int bfs(int s, int t)//重新建图,按层次建图
  11. {
  12. queue<int> q;
  13. while(!q.empty())
  14. q.pop();
  15. memset(dep, -, sizeof(dep));
  16. dep[s] = ;
  17. q.push(s);
  18. while(!q.empty()){
  19. int u = q.front();
  20. q.pop();
  21. for(int v = ; v <= m; v++){
  22. if(c[u][v] > && dep[v] == -){//如果可以到达且还没有访问,可以到达的条件是剩余容量大于0,没有访问的条件是当前层数还未知
  23. dep[v] = dep[u] + ;
  24. q.push(v);
  25. }
  26. }
  27. }
  28. return dep[t] != -;
  29. }
  30.  
  31. int dfs(int u, int mi, int t)//查找路径上的最小流量
  32. {
  33. if(u == t)
  34. return mi;
  35. int tmp;
  36. for(int v = ; v <= m; v++){
  37. if(c[u][v] > && dep[v] == dep[u] + && (tmp = dfs(v, min(mi, c[u][v]), t))){
  38. c[u][v] -= tmp;
  39. c[v][u] += tmp;
  40. return tmp;
  41. }
  42. }
  43. return ;
  44. }
  45.  
  46. int dinic()
  47. {
  48. int ans = , tmp;
  49. while(bfs(, m)){
  50. while(){
  51. tmp = dfs(, inf, m);
  52. if(tmp == )
  53. break;
  54. ans += tmp;
  55. }
  56. }
  57. return ans;
  58. }
  59.  
  60. int main()
  61. {
  62. while(~scanf("%d %d", &n, &m)){
  63. memset(c, , sizeof(c));
  64. int u, v, w;
  65. while(n--){
  66. scanf("%d %d %d", &u, &v, &w);
  67. c[u][v] += w;
  68. }
  69. printf("%d\n", dinic());
  70. }
  71. return ;
  72. }

Dinic解法

网络流——poj1273(入门)的更多相关文章

  1. HDU 1532 Drainage Ditches 分类: Brush Mode 2014-07-31 10:38 82人阅读 评论(0) 收藏

    Drainage Ditches Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  2. [补档]暑假集训D6总结

    考试 不是爆零,胜似爆零= = 三道题,就拿了20分,根本没法玩好吧= = 本来以为打了道正解,打了道暴力,加上个特判分,应该不会死的太惨,然而--为啥我只有特判分啊- - 真的是惨. 讲完题觉得题是 ...

  3. [补档]暑假集训D5总结

    %dalao 今天又有dalao来讲课,讲的是网络流 网络流--从入门到放弃:7-29dalao讲课笔记--https://hzoi-mafia.github.io/2017/07/29/27/   ...

  4. ACM/ICPC 之 网络流入门-EK算法(参考模板)(POJ1273)

    基于残留网络与FF算法的改进-EK算法,核心是将一条边的单向残留容量的减少看做反向残留流量的增加. //网络流 //EK算法 //Time:16Ms Memory:348K #include<i ...

  5. poj1273 网络流入门题 dinic算法解决,可作模板使用

    Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 62078   Accepted: 2384 ...

  6. 网络流入门—用于最大流的Dinic算法

    "网络流博大精深"-sideman语 一个基本的网络流问题 最早知道网络流的内容便是最大流问题,最大流问题很好理解: 解释一定要通俗! 如右图所示,有一个管道系统,节点{1,2,3 ...

  7. nyoj_323:Drainage Ditches(网络流入门)

    题目链接 网络流入门@_@,此处本人用的刘汝佳的Dinic模板 #include<bits/stdc++.h> using namespace std; const int INF = 0 ...

  8. 网络流入门-POJ1459PowerNetwork-Dinic模板

    (我有什么错误或者你有什么意见,欢迎留言或私聊!谢谢!) (Ps:以前听说过网络流,想着以后再学,这次中南多校赛也碰到有关网络流的题目,想着这两天试着学学这个吧~~ 这是本人网络流入门第二题,不知道怎 ...

  9. Tile Cut~网络流入门题

    Description When Frodo, Sam, Merry, and Pippin are at the Green Dragon Inn drinking ale, they like t ...

随机推荐

  1. mac install PyQt5

    1. install brew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/insta ...

  2. vue2高仿饿了么app

    Github地址: https://github.com/ccyinghua/appEleme-project 一.构建项目所用: vue init webpack appEleme-project ...

  3. Ehcache基于java API实现

    上代码: package com.utils.cacheutils; import com.situopenapi.constant.EhcacheConstants; import com.situ ...

  4. http状态码(status_codes)

    首先:1XX 接受的请求正在处理,2XX请求正常处理完毕,3XX需要进行附加操作以完成请求(重定向?),4XX服务器无法处理请求(也就是客户端请求错误),5XX服务器处理请求出错. 当然不仅仅是一张图 ...

  5. cors(Cross-origin resource sharing)跨域资源共享

    阮一峰老师的文章(http://www.ruanyifeng.com/blog/2016/04/cors.html)跨域资源共享详解和https://developer.mozilla.org/zh- ...

  6. 简易的vuex用法

    vuex是vue中用于管理全局状态的一个组件,用于不同组件之间的通信,下面将介绍它的简单用法 首先安装vue与vuex npm install vue npm install vuex --save ...

  7. h5移动端页面meta标签

    <!DOCTYPE html> <!-- 使用 HTML5 doctype,不区分大小写 --> <html lang="zh-cmn-Hans"&g ...

  8. laravel路由组+中间件

    在rotues中的web.php

  9. python中 列表常用的操作

    列表可以装大量的数据,不限制数据类型,表示方式:[]:列表中的元素用逗号隔开. lst = [] #定义一个空列表 lst = ["Tanxu",18,"女", ...

  10. dz论坛Discuz_X3.4最新网站漏洞

    近期我们sinesafe安全部门审计discuz最新版的时候发现配置文件写入导致代码执行的问题.cms安装的时候一般会分为几个步骤去进行,其中有对配置文件config进行写入的步骤,当写入的时候未严格 ...