Time Limit: 2000MS | Memory Limit: 32768K | |
Total Submissions: 10007 | Accepted: 5421 |
Description

An example is in figure 1. The label x/y of power station u shows that p(u)=x and p max(u)=y. The label x/y of consumer u shows that c(u)=x and c max(u)=y. The label x/y of power transport line (u,v) shows that l(u,v)=x and l max(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
Hint
Source
#include<stdio.h>
#include<iostream>
using namespace std;
int n,nb,nc,m,gap[105],flow[105][105],dist[105];
int find_path(int p,int limit=0x3f3f3f3f)
{
if(p==n-1) return limit;
for(int i=0;i<n;i++)
if(dist[p]==dist[i]+1 && flow[p][i]>0)
{
int t=find_path(i,min(flow[p][i],limit));
if(t<0) return t;
if(t>0)
{
flow[p][i]-=t;
flow[i][p]+=t;
return t;
}
}
int label=n;
for(int i=0;i<n;i++) if(flow[p][i]>0) label=min(label,dist[i]+1);
if(--gap[dist[p]]==0 || dist[0]>=n ) return -1;
++gap[dist[p]=label];
return 0;
}
int sap()
{
int t=0,maxflow=0;
gap[0]=n;
while((t=find_path(0))>=0)
maxflow+=t;
return maxflow;
}
int main()
{
int source,end,x,y,c;
while(scanf("%d%d%d%d",&n,&nb,&nc,&m)!=EOF)
{
memset(gap,0,sizeof(gap));
memset(flow,0,sizeof(flow));
memset(dist,0,sizeof(dist));
source=0;
end=n+1;
for(int i=0;i<m;i++)
{
while(getchar()!='(');
scanf("%d,%d)%d",&x,&y,&c);
flow[x+1][y+1]+=c;
}
for(int i=0;i<nb;i++)
{
while(getchar()!='(');
scanf("%d)%d",&x,&c);
flow[source][x+1]+=c;
}
for(int i=0;i<nc;i++)
{
while(getchar()!='(');
scanf("%d)%d",&x,&c);
flow[x+1][end]+=c;
}
n+=2;
printf("%d/n",sap());
}
return 0;
}