最大流EK算法模板

来源:互联网 发布:微信一键传图软件 编辑:程序博客网 时间:2024/05/29 10:12

来自刘汝佳小白书当中的代码,每次使用广度优先搜索来寻找增广路径。

const int maxn=501;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];    int a[maxn];    int p[maxn];    void init(int n)    {        for(int i=0;i<=n;i++)            G[i].clear();        edges.clear();    }    void AddEdge(int from,int to,int 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)    {        int flow=0;        while(true)        {            memset(a,0,sizeof(a));            queue<int> Q;            Q.push(s);            a[s]=INT_MAX;            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;    }};
0 0