最大流增广路算法

最大流增广路算法

Edmonds_Karp算法:通过bfs从零流开始不断寻找增广路,当无法在增广时,此时流为最大流

/*  Edmonds_Karp算法 */



int cap[maxn][maxn],flow[maxn][maxn]; //cap容量,flow流量,相减得残量



int Edmonds_Karp(int s,int t)

{

    int f=0;

    int p[maxn],a[maxn]; //p记录路径

    queue<int> q;

    memset(flow,0,sizeof(flow)); //初始化流量为0

    while(1){

        memset(a,0,sizeof(a)); //将a置0

        a[s]=INF;  //a[s]处置为INF

        q.push(s);    //s入队

        while(!q.empty()){

            int u=q.front();q.pop();

            for(int v=0;v<=n+2;v++){

                if(!a[v]&&cap[u][v]-flow[u][v]>0){ //对每条队头u的残量>0的出边,v入队,记录路径;

                    q.push(v);

                    p[v]=u;

                    a[v]=min(a[u],cap[u][v]-flow[u][v]); //这句增广别忘了

                }

            }

        }

        if(a[t]==0) return f;  //不能再增广时返回f

        for(int u=t;u!=s;u=p[u]){ //沿路径回溯

            flow[p[u]][u]+=a[t];

            flow[u][p[u]]-=a[t];

        }

        f+=a[t]; //增广

    }

}
Edmonds_Karp

你可能感兴趣的:(最大流)