POJ1459 Power Network 点击打开链接
大致题意:
题蛮长的,但是一堆废话,我读了三遍才懂。
现在有np个发电站,每个发电站能生产最多P电量。有nc个顾客,每个顾客能消耗最大C电量。
其余的点代表转电站,既不消耗也不生产。每两个点之间有一条输电线,最大输送电量为L。
现在问,所有的顾客消耗的总电量最大是多少。。。
这道题就是求最大流,不过源点不唯一,汇点不唯一,不能直接使用dinic。
那怎么办呢?
我们做以往的最大流时知道,源点输送的电量是无穷的,所以我们在设置一个点,做总源点,它指向全部的发电站,
总源点到达各发电站的最大输送量就是每个发电站的最多生产量。
同理,我们在设个总汇点,让所有的顾客都流向它。
那这道题就转换成了求最大流。。。
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<queue>
#define inf 0x3f3f3f3f
using 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);
}
}