主要是建图。
自己创源点S和汇点T,
源点S流入所有的发电站, 所有用户连接流入汇点T。
调度节点不管它。
流入T点得最大流则为题目中所求的Con
//760K 719MS G++ 1765B
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <string>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <cstdio>
#include <map>
using namespace std;
int const MAX=128;
int const inf=0x3f3f3f3f;
int m[MAX][MAX], flow[MAX], visit[MAX], front[MAX];
int N, NC, NP, M;
int S, T;
int bfs()
{
int i, u;
queue<int> Q;
while(!Q.empty()) Q.pop();
memset(flow, 0, sizeof flow);
memset(visit, 0, sizeof visit);
flow[S]=inf;
visit[S]=1;
Q.push(S);
while(!Q.empty())
{
u=Q.front();
Q.pop();
for(i=0; i<=N+1; i++)
{
if(!visit[i] && m[u][i]>0)
{
visit[i]=1;
front[i]=u;
Q.push(i);
flow[i]=m[u][i]<flow[u]?m[u][i]:flow[u];
}
}
}
return flow[T];
}
int Edmonds_Karp()
{
int max_flow=0, f, u;
while((f=bfs())!=0)
{
for(u=T; u!=S; u=front[u])
{
m[front[u]][u]-=f;
m[u][front[u]]+=f;
}
max_flow+=f;
}
return max_flow;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
int tmp_pc=0, tmp_m=0, max_flow;
int u, v, z, c;
while(scanf("%d %d %d %d ", &N, &NP, &NC, &M)!=EOF)
{
S=N;
T=N+1;
memset(m, 0, sizeof m);
for(tmp_m=0; tmp_m<M; tmp_m++)
{
while((c=getchar())!='(') NULL;
scanf("%d", &u);
getchar();
scanf("%d", &v);
getchar();
scanf("%d", &z);
m[u][v]=z;
}
for(tmp_pc=0; tmp_pc<NP+NC; tmp_pc++)
{
while((c=getchar())!='(') NULL;
scanf("%d", &u);
getchar();
scanf("%d", &z);
if(tmp_pc<NP)
m[S][u]=z;
else
m[u][T]=z;
}
max_flow=Edmonds_Karp();
printf("%d\n", max_flow);
}
return 0;
}