网络流(模板)

来源:互联网 发布:苏豪控股网络 编辑:程序博客网 时间:2024/05/17 04:33

理论:http://mindlee.net/2011/11/19/network-flow/


//Edmonds-Karp(EK)hdu3549#include <cstdio>#include <algorithm>#include <queue>using namespace std;const int M=110;const int inf=1<<30;int capacity[M][M],flow[M],pre[M],n,m;queue<int> Q;void init(){    for (int i=1;i<=n;++i)        for (int j=1;j<=n;++j)            capacity[i][j]=0;}int BFS(int s,int t){    for (long i=1;i<=n;++i) pre[i]=-1;while (!Q.empty()) Q.pop();    pre[s]=s; flow[s]=inf;    Q.push(s);         while (!Q.empty()){        int u=Q.front(); Q.pop();        if (u==t) break;        for (int i=1;i<=n;++i)            if (pre[i]==-1 && capacity[u][i]>0){                pre[i]=u;                  flow[i]=std::min(flow[u],capacity[u][i]);                Q.push(i);            }    }    if (pre[t]==-1) return -1;    else return flow[t];}int MaxFlow(int s,int t){    int SumFlow=0,temp;    while (temp=BFS(s,t)!=-1){        long k=t;        while (k!=pre[k]){            capacity[pre[k]][k]-=temp;            capacity[k][pre[k]]+=temp;            k=pre[k];        }        SumFlow+=temp;    }    return SumFlow;}int main(){    int t; scanf("%d",&t);    for (int i=1;i<=t;++i){        scanf("%d%d",&n,&m);        init();        for (int j=1;j<=m;++j){            int u,v,c;            scanf("%d%d%d",&u,&v,&c);            if (u==v) continue;            capacity[u][v]+=c;        }        printf("Case %d: %d\n",i,MaxFlow(1,n));    }    return 0;}


原创粉丝点击