【模板】最大流之EdmondsKarp算法

他人博客详细讲解:http://www.cnblogs.com/zsboy/archive/2013/01/27/2878810.html

好像大概意思是不停地用bfs找一条增广链,并更新答案,直到找不到为止,构图时需构建反向弧,来让错误的路可以往回走。。

程序:

#include<iostream>
#include<cstdio>
#include<queue>
#include<cmath>
#include<vector>
#include<cstring>
using namespace std;
struct ding{
   int from,to,cap,now;
};
int a[20000],p[20000];
vector<ding>edge;
vector<int>g[20000];
int esize=0,n,m;
void add(int from1,int to1,int val)
{
  edge.push_back((ding){from1,to1,val,0});
  edge.push_back((ding){to1,from1,0,0});
  g[from1].push_back(esize);
  g[to1].push_back(esize+1);
  esize+=2;
}
int maxlow(int s,int t)
{
  int ans=0;
  while (true)
  {
      queue<int>q;
      q.push(s);
      memset(a,0,sizeof a);
      a[s]=2100000000;
      while (!q.empty())
      {
        int k=q.front(); q.pop();
      for (int i=0;i<=g[k].size()-1;i++)
      {
          ding enow=edge[g[k][i]];
          if ((a[enow.to]==0)&&(enow.now<enow.cap))
          {
            a[enow.to]=min(a[k],enow.cap-enow.now);
          p[enow.to]=g[k][i];
          q.push(enow.to);
        }
      }
      if (a[t]) break;
    }
    if (!a[t]) break;
    ans+=a[t];
    for (int i=t;i!=s;i=edge[p[i]].from)
    {
      edge[p[i]].now+=a[t];
      edge[p[i]^1].now-=a[t];
    }
  }
  return ans;
}
int main()
{
  int s,t,u,v,w;
  scanf("%d%d%d%d",&n,&m,&s,&t);
  for (int i=1;i<=m;i++)
  {
    scanf("%d%d%d",&u,&v,&w);
    add(u,v,w);
  }
  printf("%d\n",maxlow(s,t));
  return 0;
} 
时间: 2024-10-10 00:40:39

【模板】最大流之EdmondsKarp算法的相关文章

关于最大流的EdmondsKarp算法详解

最近大三学生让我去讲课,我就恶补了最大流算法,笔者认为最重要的是让学弟学妹们入门,知道算法怎么来的?为什么是这样?理解的话提出自己的改进,然后再看看Dinic.SAP和ISAP算法….. 一.概念引入 首先要先清楚最大流的含义,就是说从源点到经过的所有路径的最终到达汇点的所有流量和. 流网络G=(V,E)是一个有向图,其中每条边(u,v)∈E均有一个非负容量c(u,v)>=0.如果(u,v)不属于E,则假定c(u,v)=0.流网络中有两个特别的顶点:源点s和汇点t.下图展示了一个流网络的实例(其

POJ 3281 Dining (网络流最大流 拆点建图 Edmonds-Karp算法)

Dining Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10159   Accepted: 4676 Description Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she will consume no others. Farmer John has cooked fabulo

Edmonds-Karp算法,最大流POJ(1459)

题目链接:http://poj.org/problem?id=1459 解题报告: 电力调度站不涉及流的产生和消耗,不用考虑,Edmonds-Karp算法,就是利用剩余网络和增广路来解决,网络中的最大流. 原理:剩余网络,就是一种回退,构造完在剩余网络后,在剩余网络中找一条增广路,其中的最小流量,每个边加上这个最小流量或者减去这个最小流量,那么流就变成最大的了. 在加上或者减去这个最小流量时,初始化flow[][]这个剩余网络为0,最小流量node[v]=min(node[u],cap[u][v

Codeforces Round #304 (Div. 2) E. Soldier and Traveling 最大流 Dinic EK 算法

E. Soldier and Traveling time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output In the country there are n cities and m bidirectional roads between them. Each city has an army. Army of the i-th ci

POJ 1273 Drainage Ditches (最大流问题——Edmonds-Karp算法)

一.最大流问题 最大流问题最形象的比喻就是给定一个有向图G(V,E),每个边有一定的权值表示边的容量,再给定起点s和终点t,s处有水不断的流出,t是一个蓄水池,问最多有多少水从s流进了t? 二.Edmonds-Karp算法 简单来说这个算法就是不断重复这样的操作: 1.从图中找到s到t的路径(为了减小时间复杂度使用bfs来寻找最短的一条路径),如果找不到路径,那么就结束. 2.找到的该路径所有边容量的最小值,这是s通过这条路径到达t的最大值,称为nMinFlow 3.从这条路径的每一个边上的容量

最大流之sap算法

若有向图G = (V , E)满足下列条件: 1.有且仅有一个顶点S,它的入度为 0 ,这个顶点称为源点. 2.有且仅有一个顶点T,它的出度为 0 ,这个顶点称为汇点. 3.每一条弧都有一个非负数,叫做这条边的容量,边(Vi , Vj)的容量用 Cij 来表示. 则此有向图称为网络流图,记为 G = ( V , E , C) ; 对于网络流图G中,每一条弧( i , j )都给定一个非负数Fij,对于一组数据满足下面三个条件时,称为可行流: 1.对于每条弧都有 Fij < Cij ; 2.出了源

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

图论模板--最大流及费用流模板 最大流--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 :说明残留网络

HDU1532最大流 Edmonds-Karp算法 模板

Drainage Ditches Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 45 Accepted Submission(s): 38   Problem Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorit

最大流的EK算法模板

模板题:洛谷p3376 题目大意: 给出一个网络图,以及其源点和汇点,求出其网络最大流. 基本思路: 套模板 EK的时间复杂度O(V*E^2) EK算法思路: 1.通过BFS拓展合法节点(每个节点在本次BFS中仅遍历一次),找到汇点,并记录每个节点的前面节点(pre)(若找不到增广路,算法结束) 2.通过BFS的记录,从汇点回溯回源点,记录下每条弧流量的**最小值**minn, ans += minn(否则就会超出某条边的限制流量) 3.将所有经过的边的流量减去minn,反向边加上minn 4.