poj 1459 Power Network

来源:互联网 发布:生化危机6mac 编辑:程序博客网 时间:2024/06/08 14:33

                 POJ1459  Power Network  点击打开链接

大致题意:

题蛮长的,但是一堆废话,我读了三遍才懂。

现在有np个发电站,每个发电站能生产最多P电量。有nc个顾客,每个顾客能消耗最大C电量。

其余的点代表转电站,既不消耗也不生产。每两个点之间有一条输电线,最大输送电量为L。

现在问,所有的顾客消耗的总电量最大是多少。。。

这道题就是求最大流,不过源点不唯一,汇点不唯一,不能直接使用dinic。

那怎么办呢?

我们做以往的最大流时知道,源点输送的电量是无穷的,所以我们在设置一个点,做总源点,它指向全部的发电站,

总源点到达各发电站的最大输送量就是每个发电站的最多生产量。

同理,我们在设个总汇点,让所有的顾客都流向它。

那这道题就转换成了求最大流。。。

#include<stdio.h>#include<iostream>#include<string.h>#include<algorithm>#include<queue>#define inf 0x3f3f3f3fusing namespace std;int dis[200];int flow[200][200];int n,np,nc,m;int bfs( ){    memset(dis,-1,sizeof(dis));    queue<int>Q;    dis[0]=1;    Q.push(0);    while(!Q.empty())    {        int top=Q.front();        Q.pop();        for(int i=0;i<=n+1;i++)        {            if(flow[top][i]>0&&dis[i]<0)            {                dis[i]=dis[top]+1;                Q.push(i);            }        }    }    if(dis[n+1]>0)return 1;    return 0;}int dfs(int k,int y){    if(k==n+1)        return y;        int fl;    for(int i=0;i<=n+1;i++)    {        if(flow[k][i]>0&&dis[i]==dis[k]+1&&(fl=dfs(i,min(y,flow[k][i]))))        {            flow[k][i]-=fl;            flow[i][k]+=fl;            return fl;        }    }    return 0;}int main(){    while(~scanf("%d%d%d%d",&n,&np,&nc,&m))    {//ios::sync_with_stdio(false);        memset(flow,0,sizeof(flow));        char c;        int x,y,z;        for(int i=0;i<m;i++)        {            cin>>c>>x>>c>>y>>c>>z;            flow[x+1][y+1]+=z;        }        for(int i=0;i<np;i++)        {            cin>>c>>x>>c>>y;            flow[0][x+1]=y;        }        for(int i=0;i<nc;i++)        {            cin>>c>>x>>c>>y;            flow[x+1][n+1]=y;        }        int ans=0,res;        while(bfs())        {//cout<<"++"<<endl;            while((res=dfs(0,inf)))ans+=res;        }        printf("%d\n",ans);    }}



原创粉丝点击