POJ 1459 Power Network

有多个发电站 中转站 和用户  多源 多汇的最大流问题   

建立源点 和 汇点 将发电站连到源点上将用户连到汇点上 求图的最大流

#include<iostream>
#include<queue>
#include<stdio.h>
#include<cstring>
using namespace std;
#define INF 0x7fffffff
int cap[503][503],a[503],p[503];
int ek(int s,int t,int n)
{
       int f=0;
        while(1)
        {
            queue<int> q;
            memset(a,0,sizeof(a));
            a[s]=INF;
            q.push(s);
            while(!q.empty())
            {
                int u=q.front();
                q.pop();
                for(int v=0;v<=n;v++)
                if(!a[v]&&cap[u][v])
                {
                    p[v]=u;
                    q.push(v);
                    a[v]=a[u]<cap[u][v]?a[u]:cap[u][v];
                }
            }
            if(a[t]==0)
            break;
            for(int u=t;u!=s;u=p[u])
            {
                cap[p[u]][u]-=a[t];
                cap[u][p[u]]+=a[t];
            }
            f+=a[t];

        }
        return f;
}

int main()
{
    int n,np,nc,m;
    while(cin>>n)
    {
        int u,v,z;
        char str[11];
        cin>>np>>nc>>m;
        memset(cap,0,sizeof(cap));
        for(int i=1;i<=m;i++)
           {

               scanf("%s",str);
               sscanf(str,"(%d,%d)%d",&u,&v,&z);
               cap[u][v]=z;
           }
           for(int i=1;i<=np;i++)
           {
               scanf("%s",str);
               sscanf(str,"(%d)%d",&u,&z);
               cap[n][u]=z;
            }
            for(int i=1;i<=nc;i++)
             {
                 scanf("%s",str);
                 sscanf(str,"(%d)%d",&u,&z);
                 cap[u][n+1]=z;
             }
             int s=n,t=n+1;
             cout<<ek(s,t,n+1)<<endl;
    }
    return 0;
}

  

posted @ 2011-07-26 22:50  Crazy_yiner  阅读(138)  评论(0编辑  收藏  举报