zoukankan      html  css  js  c++  java
  • POJ 1459 Power Network

    最大流-多源多汇问题

    建立超级源点,超级汇点

    #include<iostream>
    #include<cstring>
    #include<queue>
    #include<vector>
    using namespace std;
    const int inf=0xfffffff;
    queue<int>q;
    int n,np,nc,m,s,t;
    int cap[105][105],flow[105][105],d[105],g[105][105];
    int main()
    {
        int i,a,b,c,f,ss;
        char s1,s2,s3;
        while(cin>>n>>np>>nc>>m)
        {
            s=n;t=n+1;
            memset(cap,0,sizeof(cap));
            memset(flow,0,sizeof(flow));
            memset(g,0,sizeof(g));
            for(i=0;i<m;i++)
            {
                cin>>s1>>a>>s2>>b>>s3>>c;
                if(a==b) continue;
                cap[a][b]=c;
                g[a][++g[a][0]]=b;
            }
            for(i=0;i<np;i++)
            {
                cin>>s1>>a>>s2>>c;
                cap[s][a]=c;
                g[s][++g[s][0]]=a;
            }
            for(i=0;i<nc;i++)
            {
                cin>>s1>>a>>s2>>c;
                cap[a][t]=c;
                g[a][++g[a][0]]=t;
            }
            f=0;
            int p[105];
            for(;;)
            {
                memset(d,0,sizeof(d));
                d[s]=inf;
                q.push(s);ss=0;
                while(!q.empty())
                {
                    int u=q.front();q.pop();
                    for(int v=1;v<=g[u][0];v++) if(!d[g[u][v]] && cap[u][g[u][v]]>flow[u][g[u][v]])
                    {
                        p[g[u][v]]=u;q.push(g[u][v]);
                        int tt=cap[u][g[u][v]]-flow[u][g[u][v]];
                        d[g[u][v]]=d[u]<tt?d[u]:tt;
                        if(g[u][v]==t)
                        {
                            ss=1;break;
                        }
                    }
                    if(ss) break;
                }
                while(!q.empty()) q.pop();
                if(d[t]==0) break;
                for(int u=t;u!=s;u=p[u])
                {
                    flow[p[u]][u]+=d[t];
                    flow[u][p[u]]-=d[t];
                }
                f+=d[t];
            }
            cout<<f<<endl;
        }
        return 0;
    }
    



  • 相关阅读:
    第11组 团队Git现场编程实战
    第11组 团队项目-需求分析报告
    团队项目-选题报告
    第二次结对编程作业
    第11组 团队展示
    第一次结对编程作业
    Nginx学习笔记
    Git学习笔记
    Qt学习笔记
    Eclipse中Outline里各种图标的含义
  • 原文地址:https://www.cnblogs.com/java20130726/p/3218252.html
Copyright © 2011-2022 走看看