最大流的EK算法模板

模板题:洛谷p3376

题目大意:

给出一个网络图,以及其源点和汇点,求出其网络最大流。

基本思路:

套模板

EK的时间复杂度O(V*E^2)

EK算法思路: 
1.通过BFS拓展合法节点(每个节点在本次BFS中仅遍历一次),找到汇点,并记录每个节点的前面节点(pre)(若找不到增广路,算法结束) 
2.通过BFS的记录,从汇点回溯回源点,记录下每条弧流量的**最小值**minn, ans += minn(否则就会超出某条边的限制流量) 
3.将所有经过的边的流量减去minn,反向边加上minn 
4.重复上述步骤,直到找不到增广路,算法结束。

代码如下:

#include<iostream>
#include<string>
#include<queue>
#include<vector>
#include<stack>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>

using namespace std;

typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn =10000+10;
int n,m,st,en;
struct Flow{
    int st,en,num;
}flow[200000+10];
vector<int>gra[maxn];
bool vis[maxn];
int pre[maxn];
bool bfs(){
    memset(vis,false,sizeof(vis));
    vis[st]=true;
    queue<int>q;
    q.push(st);
    while(!q.empty()){
        int qf=q.front();
        q.pop();
        int sz=gra[qf].size();
        for(int i=0;i<sz;i++){
            int id=gra[qf][i];
            int v=flow[id].en;
            if(flow[id].num>0&&!vis[v]){
                vis[v]=true;
                q.push(v);
                pre[v]=id;
                if(v==en){
                    return true;
                }
            }
        }
    }
    return false;
}
int EK(){
    int max_flow=0;
    while(bfs()){
        int _min=inf;
        for(int i=en;i!=st;i=flow[pre[i]].st){
            _min=min(_min,flow[pre[i]].num);
        }
        for(int i=en;i!=st;i=flow[pre[i]].st){
            flow[pre[i]].num-=_min;
            flow[pre[i]+m].num+=_min;
        }
        max_flow+=_min;
    }
    return max_flow;
}
int main(){
    scanf("%d%d%d%d",&n,&m,&st,&en);
    for(int i=0;i<m;i++){
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        flow[i].st=u;
        flow[i].en=v;
        flow[i].num=w;
        flow[i+m].st=v;
        flow[i+m].en=u;
        flow[i+m].num=0;
        gra[u].push_back(i);
        gra[v].push_back(i+m);
    }
    printf("%d\n",EK());
    return 0;
}

原文地址:https://www.cnblogs.com/imzscilovecode/p/8724078.html

时间: 2024-10-12 08:54:09

最大流的EK算法模板的相关文章

HDU-1532 Drainage Ditches (最大流,EK算法模板)

题目大意:最大流的模板题...源点是0,汇点是n-1. 代码如下: # include<iostream> # include<cstdio> # include<cmath> # include<string> # include<vector> # include<list> # include<set> # include<map> # include<queue> # include<

POJ 1273 Drainage Ditches(我的EK算法模板)

题意:给你n条边,目标位置t:接下来是每条边,包括起点,终点,容量: 感想:第一道最大流的代码,这道题是我更深地理解了Ek算法,不过这道题有个超坑的情况,那就是出现重边的情况==! 思路:EK算法 AC代码: #include<stdio.h> #include<string.h> #include<algorithm> #include<queue> using namespace std; #define INF 100000000 #define N

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 1459 Power Network 经典网络流构图问题 最大流,EK算法

题目链接:POJ 1459 Power Network Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 23347   Accepted: 12231 Description A power network consists of nodes (power stations, consumers and dispatchers) connected by power transport line

最大流EK算法模板

最近学了下最大流算法,大概思想算是懵懵懂懂了,现在想把模板记录下来,以备后面深刻学习之用. 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 5 #define _clr(x, y) memset(x, y, sizeof (x)) 6 #define Min(x, y) (x < y ? x : y) 7 #define INF 0x3f3f3f3f 8 #define N 210 9 10 in

EK算法模板

#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include<queue> using namespace std; int dp[100][100],pre[100]; const int tmin=999999999; int maxflow; void EK(int start,int end,int n){ while(1){ qu

图论 最大流EK算法

今天接触了最大流,网上有很多ppt,耐心看下,再敲几遍代码大概就能懂意思了 EK 算法 关键是要理解要理解反悔的这个意思,因为每次当你选择了一种方式,但是这种方式不一定是最优的所以我们要再来建立一条反向边, 来完成反悔的策略 然后就是大概一直找增广路,改变最大的值,一直到找不到增广路为止 现在把模板的代码附上,并且给予注释 下面有两种方式一种是紫书上刘汝佳的代码,还有种是用链式前向星,还有种是dfs的方式,之后会继续补充 分别给出两种代码 struct Edge{ int from,to,cap

【转】网络最大流——EK算法详解

原文  http://blog.csdn.net/a1dark/article/details/11177907 EdmondsKarp算法,简称EK算法,O(m^2n) 因为是初学教程,所以我会尽量避免繁杂的数学公式和证明.也尽量给出了较为完整的代码.本文的目标群体是网络流的初学者,尤其是看了各种NB的教程也没看懂怎么求最大流的小盆友们.本文的目的是,解释基本的网络流模型,最基础的最大流求法,即bfs找增广路法,也就是EK法,全名是Edmond-Karp,其实我倒是觉得记一下算法的全名和来历可

POJ1273 最大流 EK算法

套了个EK的模板 //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #include <stdio.h> #include <iostream> #include <climits> #include <cstring> #include <cmath> #include <stack> #include <queue> #i