【模板】最大流之Ford-Fulkerson算法

这个好像跟EK算法的本质差不多,不过一个dfs,一个bfs,总体看来一般用bfs会好一点。

程序:

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
struct edge{
  int from,to,cap,flow,nod;
};
vector<edge>g[20000];
int s,t;
bool vis[20000];
void add(int u,int v,int w)
{
  g[u].push_back((edge){u,v,w,0,g[v].size()});
  g[v].push_back((edge){v,u,0,0,g[u].size()-1});
}
int dfs(int now,int maxx)
{
  if (now==t) return maxx;
  vis[now]=true;
  for (int i=0;i<g[now].size();i++)
  {
      edge e=g[now][i];
      if ((!vis[e.to])&&(e.cap>e.flow))
      {
         int d=dfs(e.to,min(maxx,e.cap-e.flow));
         if (d>0)
         {
           e.flow+=d;
           g[now][i]=e;
           g[e.to][e.nod].flow-=d;
         return d;
       }
    }
  }
  return 0;
}
int main()
{
  int m,a,b,c,n;
  scanf("%d%d%d%d",&n,&m,&s,&t);
  for (int i=1;i<=m;i++)
  {
      scanf("%d%d%d",&a,&b,&c);
      add(a,b,c);
  }
  int ans=0;
  for (;;)
  {
      memset(vis,0,sizeof vis);
      int sum=dfs(s,210000000);
      if (sum==0) break;
      ans+=sum;
  }
  printf("%d\n",ans);
  return 0;
}
时间: 2024-12-28 21:56:28

【模板】最大流之Ford-Fulkerson算法的相关文章

ACM/ICPC 之 网络流入门-Ford Fulkerson(POJ1149)

按顾客访问猪圈的顺序依次构图(顾客为结点),汇点->第一个顾客->第二个顾客->...->汇点 //第一道网络流 //Ford-Fulkerson //Time:47Ms Memory:276K #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<queue> using namespace std; #def

图论模板——最大流及费用流模板

图论模板--最大流及费用流模板 最大流--SAP 时间复杂度:O(v^2*e) const int MAXN=1010;//点数的最大值 const int MAXM=1010;//边数的最大值 const int INF=0x3f3f3f3f; struct Node { int from,to,next; int cap; }edge[MAXM]; int tol; int head[MAXN]; int dep[MAXN]; int gap[MAXN];//gap[x]=y :说明残留网络

最大流——增广路算法

关于网络流的增广路算法,网上有很多详细介绍,这里是摘录的模板.详细请见:http://www.cnblogs.com/kuangbin/archive/2011/07/26/2117636.html 1 #include<iostream> 2 #include<iomanip> 3 #include<ctime> 4 #include<climits> 5 #include<algorithm> 6 #include<queue>

hdoj 3488 Tour 【最小费用最大流】【KM算法】

Tour Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total Submission(s): 2299    Accepted Submission(s): 1151 Problem Description In the kingdom of Henryy, there are N (2 <= N <= 200) cities, with M (M <= 3000

模板化的七种排序算法,适用于T* vector&lt;T&gt;以及list&lt;T&gt;

最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板纯属于偷懒,更方便于测试代码的有效性,等代码写完也懒得去改了.下面开始介绍这段代码,有什么不对的地方欢迎前来指正. 一共写了七种排序,插入排序InsertSort.堆排序HeapSort.快速排序QuickSort.合并排序MergeSort,计数排序CountingSort,基数排序RadixSo

hdu3572Task Schedule 最大流,判断满流 优化的SAP算法

PS:多校联赛的题目质量还是挺高的.建图不会啊,看了题解才会的. 参考博客:http://blog.csdn.net/luyuncheng/article/details/7944417 看了上面博客里的题解,思路就有了.不过建图还是有点麻烦.我把源点设为n+1 (不想从0开始,不修改模版),汇点就是n+2+MAX,其中MAX是题目中Ei的最大值. 这题,我有疑问:优化过的SAP算法的时间复杂度是O(m*n^2),此题的n最大为1000,m为50万,时间超过5亿了.1s的时限居然过了. 其中有个

hiho一下 第119周 #1398 : 网络流五&#183;最大权闭合子图 【最小割-最大流--Ford-Fulkerson 与 Dinic 算法】

#1398 : 网络流五·最大权闭合子图 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 周末,小Hi和小Ho所在的班级决定举行一些班级建设活动. 根据周内的调查结果,小Hi和小Ho一共列出了N项不同的活动(编号1..N),第i项活动能够产生a[i]的活跃值. 班级一共有M名学生(编号1..M),邀请编号为i的同学来参加班级建设活动需要消耗b[i]的活跃值. 每项活动都需要某些学生在场才能够进行,若其中有任意一个学生没有被邀请,这项活动就没有办法进行. 班级建设的活

【模板】强连通分量和tarjan算法

看了好久才终于明白了这个算法..复杂度是O(n+m). 我觉得这个算法不是很好理解,但是看懂了以后还是觉得听巧妙的. 下面给出模板代码和三组简单数据帮助理解. 代码如下: 1 #include <stdio.h> 2 #include <stack> 3 #include <algorithm> 4 #include <string.h> 5 #include <vector> 6 using namespace std; 7 8 const i

图论之随机配流01——基于LOGIT的STOCH配流法-经典dial算法

function dialsuanfa(T) %程序说明 clc disp('========================================================================================'); disp('                   <基于LOGIT的STOCH配流法--dial算法>'); disp('运行环境:MATLAB 8.3.0.532 '); disp('作者信息:兰州交通大学  刘志祥   QQ:531

hdu1532 (最大流入门,EK算法)

看着这个博客 然后敲了hdu1532这个入门题,算是对最大流有点理解了 1 #include <stdio.h> 2 #include <string.h> 3 #include <queue> 4 using namespace std; 5 const int INF = 1<<30; 6 const int N = 200 + 10; 7 int n,m; 8 int cap[N][N],flow[N],pre[N]; 9 int bfs(int sr