码迷,mamicode.com
首页 > 其他好文 > 详细

网络流模板(更新中)

时间:2015-06-09 23:42:57      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:图论   网络   

/*
最大流EK算法,O(V*E*E)
*/
#include<stdio.h>
#include<string.h>
#include<queue>
const int N = 205;

int n,m;
int cap[N][N],f[N][N],pre[N],rest[N];
int sNode,eNode;

void init(){
    memset(f,0,sizeof(f));
    memset(cap,0,sizeof(cap));
}

bool searchPath(){//找一条增广路
    bool vist[N]={0};
    queue<int>q;
    int u,v;
    u=sNode; vist[u]=1;
    pre[u]=u; rest[u]=1<<30;
    q.push(u);
    while(!q.empty()){
        u=q.front(); q.pop();
        for(v=1; v<=n; v++)
        if(!vist[v]&&cap[u][v]-f[u][v]>0)
        {
            vist[v]=1; pre[v]=u;
            if(cap[u][v]-f[u][v]>rest[u])
              rest[v]=rest[u];
            else
                rest[v]=cap[u][v]-f[u][v];
            if(v==eNode) return true;
            q.push(v);
        }
    }
    return false;
}
int maxflow(){
    int ans=0;
    while(searchPath()){
        ans+=rest[eNode];
        int v=eNode;
        while(v!=sNode){
            int u=pre[v];
            f[u][v]+=rest[eNode];
            f[v][u]-=rest[eNode];//给一个回流的机会
            v=u;
        }
    }
    return ans;
}
int main(){
    int a,b,c;
    while(~scanf("%d%d",&n,&m)){
        scanf("%d%d",&sNode,&eNode);
        init();
        while(m--){
            scanf("%d%d%d",&a,&b,&c);
            cap[a][b]+=c;
        }
        printf("%d\n",maxflow())
    }
}

网络流模板(更新中)

标签:图论   网络   

原文地址:http://blog.csdn.net/u010372095/article/details/46433637

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!