Time Limit: 2000MS | Memory Limit: 32768K | |
Total Submissions: 10412 | Accepted: 5705 |
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<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int inf=(1<<31)-1;
const int point_num=300;
int cap[point_num][point_num],dist[point_num],gap[point_num];//初始化见main里面
int s0,t0,n;//源,汇和点数
int find_path(int p,int limit=0x3f3f3f3f)
{
if(p==t0) return limit;
for(int i=0;i<n;i++)
if(dist[p]==dist[i]+1 && cap[p][i]>0)
{
int t=find_path(i,min(cap[p][i],limit));
if(t<0) return t;
if(t>0)
{
cap[p][i]-=t;
cap[i][p]+=t;
return t;
}
}
int label=n;
for(int i=0;i<n;i++) if(cap[p][i]>0) label=min(label,dist[i]+1);
if(--gap[dist[p]]==0 || dist[s0]>=n ) return -1;
++gap[dist[p]=label];
return 0;
}
int sap()
{
//初始化s0,t0;
int t=0,maxflow=0;
gap[0]=n;
while((t=find_path(s0))>=0) maxflow+=t;
return maxflow;
}
int main()
{
int nb,nc,m;
int x,y,c;
while(scanf("%d%d%d%d",&n,&nb,&nc,&m)!=EOF)
{
//初始化
s0=n,t0=n+1;
memset(cap,0,sizeof(cap));
memset(dist,0,sizeof(dist));
memset(gap,0,sizeof(gap));
//初始化cap
for(int i=0;i<m;i++)
{
while(getchar()!='(');
scanf("%d,%d)%d",&x,&y,&c);
cap[x][y]+=c;
}
for(int i=0;i<nb;i++)
{
while(getchar()!='(');
scanf("%d)%d",&x,&c);
cap[s0][x]+=c;
}
for(int i=0;i<nc;i++)
{
while(getchar()!='(');
scanf("%d)%d",&x,&c);
cap[x][t0]+=c;
}
n+=2;//点数加2增加了源和汇
int ans=sap();
printf("%d/n",ans);
}
return 0;
}