【待完善】EdmondsKarp算法求解最大流问题

来源:《算法竞赛入门经典(第二版)》P368

#include<vector>
#include<queue>
#include<string.h>
#define INF 0x3f3f3f3f
#define MAXN 1000
using namespace std; 

struct Edge{
    int from, to, cap, flow;
    Edge(int u, int v, int c, int f): from(u), to(v), cap(c), flow(f){}
};

struct EdmondsKarp{
    int n, m;
    vector<Edge> edges;
    vector<int> G[MAXN];//邻接表,G[i][j]表示结点i的第j条边在e数组中的序号
    int a[MAXN];//当起点到i的可改进量 
    int p[MAXN]; //最短路树上p的入弧编号 

    void init(int n){
        for(int i=0;i<n;i++){
            G[i].clear(); 
        }
        edges.clear();
    } 

    void AddEdge(int from, int to, int cap){//from:起点编号,to:终点编号,cap:容量 
        edges.push_back(Edge(from, to, cap, 0));
        edges.push_back(Edge(to, from, 0, 0));//反向弧
        m=edges.size();
        G[from].push_back(m-2);
        G[to].push_back(m-1) ;
    }

    int Maxflow(int s, int t){//s:源点编号,t:汇点编号,返回最大流 
        int flow=0;
        for(;;){
            memset(a, 0, sizeof(a));
            queue<int> Q;
            Q.push(s);
            a[s]=INF;
            while(!Q.empty()){
                int x=Q.front();
                Q.pop();
                for(int i=0;i<G[x].size();i++){
                    Edge& e=edges[G[x][i]];
                    if(!a[e.to] && e.cap>e.flow){
                        p[e.to]=G[x][i];
                        a[e.to]=min(a[x], e.cap-e.flow);
                        Q.push(e.to);
                    }
                }
                if(a[t])break;
            }
            if(!a[t])break;
            for(int u=t;u!=s;u=edges[p[u]].from){
                edges[p[u]].flow+=a[t];
                edges[p[u]^1].flow-=a[t];
            }
            flow+=a[t];
        }
        return flow;
    }
};

猜你喜欢

转载自blog.csdn.net/wingrez/article/details/81539343