poj 1459

一道简单的网络流;

这是一道多源多汇的模型;

解决的这样的模型的一个方法是:建立一个超级源和一个超级汇,然后就成为了一个模板题了!

代码:

#include<cstdio>
#include<cstring>
#include<queue>
#define inf 9999999999
#define maxn 105
using namespace std;

int map[maxn][maxn],level[maxn],m,n;

bool bfs()
{
    queue<int>q;
    memset(level,0,sizeof level);
    q.push(0);
    level[0]=1;
    while(!q.empty())
    {
        int now=q.front();
        q.pop();
        for(int i=0;i<=m+1;i++)
        {
            if(!level[i]&&map[now][i]>0)
            {
                level[i]=level[now]+1;
                q.push(i);
            }
        }
    }
    return level[m+1]!=0;
}

int dfs(int s,int cp)
{
    int tmp=cp,t;
    if(s==m+1) return cp;
    for(int i=0;i<=(m+1)&&tmp;i++)
    {
        if(level[i]==level[s]+1&&map[s][i]>0)
        {
            t=dfs(i,min(tmp,map[s][i]));
            map[s][i]-=t;
            map[i][s]+=t;
            tmp-=t;
        }
    }
    return cp-tmp;
}

int main()
{
    int ns,nc,a,b,c;
    char s[20];
    while(scanf("%d%d%d%d",&m,&ns,&nc,&n)!=EOF)
    {
        memset(map,0,sizeof map);
        for(int i=0;i<n;i++)
        {
            scanf("%s",&s);
            sscanf(s,"(%d,%d)%d",&a,&b,&c);
            a++,b++;
            map[a][b]+=c;
        }
        for(int i=0;i<ns;i++)
        {
            scanf("%s",&s);
            sscanf(s,"(%d)%d",&a,&b);
            a++;
            map[0][a]=b;
        }
        for(int i=0;i<nc;i++)
        {
            scanf("%s",&s);
            sscanf(s,"(%d)%d",&a,&b);
            a++;
            map[a][m+1]=b;
        }
        int ans=0,f;
        while(bfs())
        {
            while(f=dfs(0,inf))
                ans+=f;
        }
        printf("%d\n",ans);
    }
    return 0;
}
View Code

 

posted @ 2013-09-12 20:35  Yours1103  阅读(235)  评论(0编辑  收藏  举报