最大流 Edmonds-Karp算法 模板

算法流程

不停地找增广路进行增广,知道找不到增广路为止。
每一次bfs只找一条增广路。
时间复杂度 O(VE2)

代码

// codevs 1993 
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue> 
using namespace std;

const int inf=2100000000;

int n,m,maxflow,a[205][205],flow[205],pre[205];
//n表示边数,m表示点数,maxflow为最大流流量,a为每条边的容量,flow为每个点增广的流量,pre为增广时点的前驱 
int x,y,cap;
queue <int> q;

inline int bfs(int s,int t){
    while (!q.empty()) q.pop();
    for (int i=1;i<=m;++i) pre[i]=-1;
    pre[s]=0;
    q.push(s);
    flow[s]=inf;
    while (!q.empty()){
        int x=q.front();
        q.pop();
        if (x==t) break;
        for (int i=1;i<=m;++i)
          //EK一次只找一个增广路 
          if (a[x][i]>0&&pre[i]==-1){
            pre[i]=x;
            flow[i]=min(flow[x],a[x][i]);
            q.push(i);
          }
    }
    if (pre[t]==-1) return -1;
    else return flow[t];
}

//s为源点,t为汇点 
//increase为增广的流量 
inline void ek(int s,int t){
    int increase=0;
    while ((increase=bfs(s,t))!=-1){
        int k=t;
        while (k!=s){
            int last=pre[k];
            a[last][k]-=increase;
            a[k][last]+=increase;
            k=last;
        }
        maxflow+=increase;
    }
}

int main(){
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;++i){ 
        scanf("%d%d%d",&x,&y,&cap);
        a[x][y]+=cap;
    }
    ek(1,m);
    printf("%d\n",maxflow);
}

你可能感兴趣的:(网络流,EK)