poj 1459 最大流

来源:互联网 发布:温州网络学堂手机版 编辑:程序博客网 时间:2024/04/30 03:39
#include<iostream>#include<cstdio>#include<cstring>#include<queue>using namespace std;int f[105][105],st,en,n,par[105],c[105][105],ans;void init(){    memset(f,0,sizeof(f));    memset(c,0,sizeof(c));    st=n+1;    en=n+2;    ans=0;}void proc(){    par[en]=0;    while(par[en]!=-1)    {        queue<int> que;        que.push(st);        memset(par,-1,sizeof(par));        par[st]=st;        while(que.size()&&par[en]==-1)        {            int tp=que.front();            //cout<<tp<<2333333<<endl;            que.pop();            for(int j=1;j<=en;j++)            {                if(par[j]==-1)                {                    if(f[tp][j]<c[tp][j])                    {                        par[j]=tp;                        que.push(j);                    }                    else if(f[j][tp])                    {                        par[j]=-tp;                        que.push(j);                    }                }            }        }        if(par[en]!=-1)        {            int minn=0x3f3f3f3f,now=en;            while(now!=st)            {                int prenow=par[now];                if(prenow<0)                    minn=min(minn,f[now][-prenow]);                else                    minn=min(minn,c[prenow][now]-f[prenow][now]);                now=abs(prenow);            }            now=en;            //cout<<ans<<' '<<minn<<endl;            ans+=minn;            while(now!=st)            {                int prenow=par[now];                if(prenow<0)                    f[now][-prenow]-=minn;                else                    f[prenow][now]+=minn;                now=abs(prenow);            }        }    }    printf("%d\n",ans);}int main(){    int np,nc,m,tp,x,y;    while(scanf("%d%d%d%d",&n,&np,&nc,&m)!=EOF)    {        init();        while(m--)        {            while(getchar()!='(');            scanf("%d,%d)%d",&x,&y,&tp);            c[x+1][y+1]=tp;        }        while(np--)        {            while(getchar()!='(');            scanf("%d)%d",&y,&tp);            c[st][y+1]=tp;        }        while(nc--)        {            while(getchar()!='(');            scanf("%d)%d",&x,&tp);            c[x+1][en]=tp;        }        proc();    }    return 0;}

0 0