Time Limit: 2000MS | Memory Limit: 32768K | |
Description
An example is in figure 1. The label x/y of power station u shows that p(u)=x and pmax(u)=y. The label x/y of consumer u shows that c(u)=x and cmax(u)=y. The label x/y of power transport line (u,v) shows that l(u,v)=x and lmax(u,v)=y. The power consumed is Con=6. Notice that there are other possible states of the network but the value of Con cannot exceed 6.
Input
Output
Sample Input
2 1 1 2 (0,1)20 (1,0)10 (0)15 (1)20
7 2 3 13 (0,0)1 (0,1)2 (0,2)5 (1,0)1 (1,2)8 (2,3)1 (2,4)7
(3,5)2 (3,6)5 (4,2)7 (4,3)5 (4,5)1 (6,0)5
(0)5 (1)2 (3)2 (4)1 (5)4
Sample Output
15
6
題意:有多個電站和多個消費者,求消費者消費的最大電能。
可以引入一個超級源點s和一個超級匯點t,源點和每一個電站建一條邊,邊容量爲電站的最大產電量;每個消費者和匯點建一條邊,邊容量爲消費者消費的最大電能。
#include <iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int MAXN=105;
const int INF=(1<<29);
int level[MAXN];
int flow[MAXN][MAXN];
int s,t,n,np,nc,m;
bool bfs()
{
int queue[MAXN],front,rear;
front=rear=0;
memset(level,0,sizeof(level));
level[s]=1;
queue[rear++]=s;
while(front!=rear)
{
int v=queue[front++];
for(int i=0;i<=n;i++)
if(!level[i]&&flow[v][i])
{
level[i]=level[v]+1;
queue[rear++]=i;
}
}
if(!level[t])
return false;
return true;
}
int dfs(int i,int f)
{
if(i==t)
return f;
int sum=0;
for(int j=0;f&&j<=n;j++)
{
if(flow[i][j]&&level[i]+1==level[j])
{
int tmp=dfs(j,min(f,flow[i][j]));
flow[i][j]-=tmp;
flow[j][i]+=tmp;
sum+=tmp;
f-=tmp;
}
}
return sum;
}
int dinic()
{
int maxflow=0;
while(bfs())
maxflow+=dfs(s,INF);
return maxflow;
}
void build_graph()
{
int u,v,f;
char str[10];
memset(flow,0,sizeof(flow));
while(m--)
{
scanf("%s",str);
sscanf(str,"(%d,%d)%d",&u,&v,&f);
flow[u][v]=f;
}
while(np--)
{
scanf("%s",str);
sscanf(str,"(%d)%d",&u,&f);
flow[s][u]=f;
}
while(nc--)
{
scanf("%s",str);
sscanf(str,"(%d)%d",&u,&f);
flow[u][t]=f;
}
}
int main()
{
while(~scanf("%d%d%d%d",&n,&np,&nc,&m))
{
n++;
s=n-1;
t=n;
build_graph();
printf("%d\n",dinic());
}
return 0;
}
/*
7 2 3 13
(0,0)1
(0,1)2
(0,2)5
(1,0)1
(1,2)8
(2,3)1
(2,4)7
(3,5)2
(3,6)5
(4,2)7
(4,3)5
(4,5)1
(6,0)5
(0)5
(1)2
(3)2
(4)1
(5)4
*/