解题关键:使用的挑战程序设计竞赛上的模板,第一道网络流题目,效率比较低,且用不习惯的vector来建图。

看到网上其他人说此题有重边,需要注意下,此问题只在邻接矩阵建图时会出问题,邻接表不会存在的,也体现了邻接表的优越性?

edge结构体的第三个变量为from的下标。

模板一:

  1. #include<bits/stdc++.h>
  2. #define MAX_V 17
  3. #define inf 0x3f3f3f3f
  4. using namespace std;
  5. typedef long long ll;
  6. int n,m,s,t;
  7. struct edge{
  8. int to,cap,rev;
  9. };
  10. vector<edge>G[MAX_V];
  11. bool used[MAX_V];
  12. void add_edge(int from,int to,int cap){
  13. G[from].push_back((edge){to,cap,G[to].size()});
  14. G[to].push_back((edge){from,,G[from].size()-});
  15. }
  16. int dfs(int v,int t,int f){
  17. if(v==t)return f;
  18. used[v]=true;
  19. for(int i=;i<G[v].size();i++){
  20. edge &e=G[v][i];
  21. if(!used[e.to]&&e.cap>){
  22. int d=dfs(e.to,t,min(f,e.cap));
  23. if(d>){
  24. e.cap-=d;
  25. G[e.to][e.rev].cap+=d;
  26. return d;
  27. }
  28. }
  29. }
  30. return ;
  31. }
  32.  
  33. int max_flow(int s,int t){
  34. int flow=;
  35. while(){
  36. memset(used,,sizeof used);
  37. int f=dfs(s,t,inf);
  38. if(f==) return flow;
  39. flow+=f;
  40. }
  41. return flow;
  42. }
  43.  
  44. int main(){
  45. int T,u,v,f;
  46. scanf("%d",&T);
  47. for(int ca=;ca<=T;ca++){
  48. memset(G,,sizeof G);
  49. scanf("%d%d",&n,&m);
  50. for(int i=;i<m;i++){
  51. scanf("%d%d%d",&u,&v,&f);
  52. add_edge(u,v,f);
  53. }
  54. s=,t=n;
  55. int ans=max_flow(s,t);
  56. printf("Case %d: %d\n",ca,ans);
  57. }
  58. return ;
  59. }

模板二:dinic,187ms,比第一个快,在层次图上进行增广,且进行了当前弧优化。

  1. #include<bits/stdc++.h>
  2. #define inf 0x3f3f3f3f
  3. #define MAX_V 17
  4. using namespace std;
  5. typedef long long ll;
  6. struct edge{int to,cap,rev;};//终点,容量,反向边
  7. vector<edge>G[MAX_V];
  8. int level[MAX_V],iter[MAX_V];
  9. int n,m,s,t;
  10. void add_edge(int from,int to,int cap){
  11. G[from].push_back((edge){to,cap,G[to].size()});
  12. G[to].push_back((edge){from,,G[from].size()-});
  13. }
  14. void bfs(int s){
  15. memset(level,-,sizeof level);
  16. queue<int>que;
  17. level[s]=;
  18. que.push(s);
  19. while(!que.empty()){
  20. int v=que.front();que.pop();
  21. for(int i=;i<G[v].size();i++){
  22. edge &e=G[v][i];
  23. if(e.cap>&&level[e.to]<){
  24. level[e.to]=level[v]+;
  25. que.push(e.to);
  26. }
  27. }
  28. }
  29. }
  30.  
  31. int dfs(int v,int t,int f){
  32. if(v==t) return f;
  33. for(int &i=iter[v];i<G[v].size();i++){
  34. edge &e=G[v][i];
  35. if(e.cap>&&level[v]<level[e.to]){
  36. int d=dfs(e.to,t,min(f,e.cap));
  37. if(d>){
  38. e.cap-=d;
  39. G[e.to][e.rev].cap+=d;
  40. return d;
  41. }
  42. }
  43. }
  44. return ;
  45. }
  46.  
  47. int max_flow(int s,int t){
  48. int flow=;
  49. while(){
  50. bfs(s);
  51. if(level[t]<) return flow;
  52. memset(iter,,sizeof iter);
  53. int f;
  54. while((f=dfs(s,t,inf))>){
  55. flow+=f;
  56. }
  57. }
  58. return flow;
  59. }
  60.  
  61. int main(){
  62. int T,u,v,f;
  63. scanf("%d",&T);
  64. for(int ca=;ca<=T;ca++){
  65. memset(G,,sizeof G);
  66. memset(iter,,sizeof iter);
  67. scanf("%d%d",&n,&m);
  68. for(int i=;i<m;i++){
  69. scanf("%d%d%d",&u,&v,&f);
  70. add_edge(u,v,f);
  71. }
  72. s=,t=n;
  73. int ans=max_flow(s,t);
  74. printf("Case %d: %d\n",ca,ans);
  75. }
  76. return ;
  77. }

[hdu3549]Flow Problem(最大流模板题)的更多相关文章

  1. hdu-3549 Flow Problem---最大流模板题(dinic算法模板)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3549 题目大意: 给有向图,求1-n的最大流 解题思路: 直接套模板,注意有重边 传送门:网络流入门 ...

  2. hdu - 3549 Flow Problem (最大流模板题)

    http://acm.hdu.edu.cn/showproblem.php?pid=3549 Ford-Fulkerson算法. #include <iostream> #include ...

  3. hdu 3549 Flow Problem 最大流问题 (模板题)

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

  4. Flow Problem(最大流模板)

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

  5. HDU-3549Flow Problem 最大流模板题

    传送门 这里是Ford-Fulkerson写的最大流模板 #include <iostream> #include <cstdio> #include <algorith ...

  6. HDU3549:Flow Problem(最大流入门EK)

    #include <stdio.h> #include <string.h> #include <stdlib.h> #include <queue> ...

  7. HDU-3549 最大流模板题

    1.HDU-3549   Flow Problem 2.链接:http://acm.hdu.edu.cn/showproblem.php?pid=3549 3.总结:模板题,参考了 http://ww ...

  8. POJ 1273 - Drainage Ditches - [最大流模板题] - [EK算法模板][Dinic算法模板 - 邻接表型]

    题目链接:http://poj.org/problem?id=1273 Time Limit: 1000MS Memory Limit: 10000K Description Every time i ...

  9. Hdu3549 Flow Problem 2017-02-11 16:24 58人阅读 评论(0) 收藏

    Flow Problem Problem Description Network flow is a well-known difficult problem for ACMers. Given a ...

随机推荐

  1. 《程序员代码面试指南》第三章 二叉树问题 二叉树按层打印和ZigZag打印

    题目 二叉树按层打印和ZigZag打印 java代码 package com.lizhouwei.chapter3; import java.util.LinkedList; import java. ...

  2. Windows Server 2008无损调整分区的方法

    今天在装windows2008服务器的时候  发现系统只有C盘  该如何对C盘进行分区呢   windows2007 可以直接格式化  在windows2008服务器中格式化是灰色的  不能用  寻求 ...

  3. UVA 101 vector

    题目链接 白书上的例题,关于vector的使用.不定长数组vector,类型内部封装了一些常用操作.vector就像一个二维数组,只有第一维的大小是固定的,可以像数组一样访问到其中的每一个元素. ve ...

  4. UNIDBgrid里动态添加clientevents实现回车替换TAB

    //GRID里回车替换TABfunction cellkeydown(sender, td, cellIndex, record, tr, rowIndex, e, eOpts){ if (e.get ...

  5. EntityFramework 学习 一 Querying with EDM 从EDM查询

    前面我们已经创建EDM.DbContext和实体类,接下来我们学习不同的查询实体方法,转变为数据库的SQL查询 Entity Framework支持3种查询方式:1)LINQ to Entities ...

  6. 属性 visibility

    http://www.w3school.com.cn/cssref/pr_class_visibility.asp 可能的值 值 描述 visible 默认值.元素是可见的. hidden 元素是不可 ...

  7. JavaScript 的 async/await

    随着 Node 7 的发布,越来越多的人开始研究据说是异步编程终级解决方案的 async/await. 异步编程的最高境界,就是根本不用关心它是不是异步. async 函数就是隧道尽头的亮光,很多人认 ...

  8. Codeforces Round #377 (Div. 2) F - Tourist Reform

    前言:关于如何求双连通分量,我们可以在tarjan搜索时标记下所有桥的位置(双连通分量(可以认为是没有桥的无向图图)即可通过删去所有桥得到),那么怎么找桥呢,对于每一条搜索到的边u->x,如果l ...

  9. uva 111 History Grading(lcs)

    题目描述 在信息科学中有一些是关于在某些条件限制下,找出一些计算的最大值. 以历史考试来说好了,学生被要求对一些历史事件根据其发生的年代顺序来排列.所有事件顺序都正确的学生无疑的可以得满分.但是那些没 ...

  10. Compilation error 未完待续

    1. code.cpp:1:21: fatal error: iostream : No such file or directory #include< iostream > ^ com ...