最大流-Edmonds-Karp算法

来源:互联网 发布:导出来的sql带双引号 编辑:程序博客网 时间:2024/04/20 07:08
#include<iostream>#include<queue>using namespace std;const int maxn=205;const int inf=0x7fffffff;int r[maxn][maxn]; //残留网络,初始化为原图bool visit[maxn];int pre[maxn];int m,n;bool bfs(int s,int t)  //寻找一条从s到t的增广路,若找到返回true{    int p;    queue<int > q;    memset(pre,-1,sizeof(pre));    memset(visit,false,sizeof(visit));    pre[s]=s;    visit[s]=true;    q.push(s);    while(!q.empty())    {        p=q.front();        q.pop();        for(int i=1;i<=n;i++)        {            if(r[p][i]>0&&!visit[i])            {                pre[i]=p;                visit[i]=true;                if(i==t) return true;                q.push(i);            }        }    }    return false;}int EdmondsKarp(int s,int t){   int flow=0,d,i;   while(bfs(s,t))   {       d=inf;       for(i=t;i!=s;i=pre[i])           d=d<r[pre[i]][i]? d:r[pre[i]][i];       for(i=t;i!=s;i=pre[i])       {           r[pre[i]][i]-=d;           r[i][pre[i]]+=d;       }       flow+=d;   }   return flow;}int main(){    while(scanf("%d%d",&m,&n)!=EOF)    {        int u,v,w;        memset(r,0,sizeof(r));///        for(int i=0;i<m;i++)        {            scanf("%d%d%d",&u,&v,&w);            r[u][v]+=w;        }        printf("%d\n",EdmondsKarp(1,n));    }    return 0;}


算法思想:从源点开始搜寻增广路径,则沿增广路径可增加流量,每搜寻到一条增广路径增加相应流量,最后结果即为最大流。具体思路可参考下面博客,简单易懂。

源码博客http://blog.sina.com.cn/s/blog_6cf509db0100uy5n.html

0 0