zoukankan      html  css  js  c++  java
  • 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
    ",ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    2016/3/10 Java 错题
    2016/3/9 Java 错题集
    Java Socket 编程实验总结
    CSU 1290
    CSU 1307
    CSU 1060
    Problem B SPOJ DCEPC11I
    activemq 学习系列(二) 常用配置
    activemq 学习系列(一) 详细入门使用
    MySql 用户创建与授权
  • 原文地址:https://www.cnblogs.com/yours1103/p/3317730.html
Copyright © 2011-2022 走看看