最大流算法---Edmond-Karp

来源:互联网 发布:java内存泄露例子 编辑:程序博客网 时间:2024/06/05 19:40

这个算法是基于FF方法,就是通过不断求残余网络的增广路来增广流量,直到找不到增广路为止。注意:每次找到增广路以后都要更新原网络。EK算法通过BFS寻找源S到汇T的一条最短路径,因此时间复杂度是O(VE^2).

模板代码如下:


#include<iostream>#include<queue>#include<cstring>#include<cstdio>#define MAX 1000using namespace std;int res[MAX][MAX];int vis[MAX], pre[MAX];queue<int>q;int n;bool bfs(int s, int t){    int p;    memset(vis, 0, sizeof(vis));    memset(pre, -1, sizeof(pre));    while(!q.empty() q.pop();    q.push(s);    vis[s] = 1;    while(!q.empty())    {        p = q.front();        q.pop();        for(int i = 1;i <= n;i ++)        {            if(!vis[i] && res[p][i] > 0)            {                pre[i] = p;                vis[i] = 1;                if(i == t)                    return true;                q.push(i);            }        }    }    return false;}int EdmondKarp(int s, int t){    int flow = 0, d, i, u;    while(bfs(s, t))    {        d = 1 << 30;        u = t;        while(pre[u] != -1)        {            d = min(d, res[pre[u]][u]);            u = pre[u];        }        u = t;        while(pre[u] != -1)        {            res[pre[u]][u] -= d;            res[u][pre[u]] += d;            u = pre[u];        }        flow += d;    }    return flow;}int main(int argc, char const *argv[]) {    int m, u, v, w;    freopen("in.c", "r", stdin);    while(cin >> n >> m)    {        memset(res, 0, sizeof(res));        for(int i = 0;i < m;i ++)        {            cin >> u >> v >> w;            res[u][v] += w;        }        int ans = EdmondKarp(1, n);        cout << ans << endl;    }    return 0;}



0 0
原创粉丝点击