题解:
最大流模板题
dinic算法
建立一个超级源点跟超级汇点,把超级源点连接到发电厂,流量设为发电厂发电量
超级汇点跟耗电的用户连接,流量为消耗的电能
发电场和消耗电能的工厂用题目所给数据连接即可。
再跑一边dinic
/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <iostream>
#include <cstdio>
#include <stdlib.h>
#include <cstring>
#include <cmath>
#include <math.h>
#include <string>
#include<string.h>
#include <list>
#include <set>
#include <unordered_map>
#include <queue>
#include <stack>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#include <cctype>
#include<iomanip>
//#define int long long
#define endl '\n'
using namespace std;
const int maxn = 1e6+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const ll mod= 199999;
using namespace std;
int n,nc,np,m;
struct node{
int u,v,cap,next;
}edge[maxn];
int head[maxn],dis[maxn];
int cnt=0,cur[maxn];
//int sp=0,tp=n+1;
void init(){
memset(head,-1,sizeof head);
cnt=0;
}
void add(int u,int v,int w){
edge[cnt].u=u,edge[cnt].v=v,edge[cnt].cap=w;
edge[cnt].next=head[u],head[u]=cnt++;
edge[cnt].u=v,edge[cnt].v=u,edge[cnt].cap=0;
edge[cnt].next=head[v],head[v]=cnt++;
}
bool bfs(){
memset(dis,-1,sizeof dis);
queue<int> q;
dis[0]=0;
q.push(0);
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=head[u];~i;i=edge[i].next){
int to=edge[i].v;
int w=edge[i].cap;
if(dis[to]==-1&&w>0){
dis[to]=dis[u]+1;
q.push(to);
if(to==n+1) break;
}
}
}
return dis[n+1]!=-1;
}
int dfs(int u,int cap){
if(u==n+1||cap==0) return cap;
int res=0,f;
for(int &i=cur[u];~i;i=edge[i].next){
int to=edge[i].v;
int w=edge[i].cap;
if(dis[to]==dis[u]+1&&(f=dfs(to,min(cap-res,w)))>0){
edge[i].cap-=f;
edge[i^1].cap+=f;
res+=f;
if(res==cap) return cap;
}
}
//if(!res) dis[u]=-1;
return res;
}
int dinic(){
int ans=0;
while(bfs()){
//cout<<ans<<endl;
for(int i=0;i<=n+1;i++){
cur[i]=head[i];
}
ans+=dfs(0,MaxN);
}
return ans;
}
signed main(){
while(cin>>n>>np>>nc>>m){
init();
for(int i=0;i<m;i++){
int u,v,w;
scanf(" (%d,%d)%d",&u,&v,&w);
u++,v++;
add(u,v,w);
}
for(int i=0;i<np;i++){
int u,w;
scanf(" (%d)%d",&u,&w);
u++;
add(0,u,w);
}
for(int i=0;i<nc;i++){
int u,w;
scanf(" (%d)%d",&u,&w);
u++;
add(u,n+1,w);
}
//cout<<22<<endl;
cout<<dinic()<<endl;
}
return 0;
}