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;
}



原文地址:https://www.cnblogs.com/java20130726/p/3218252.html