题目的意思是: 有n个发电站,np个消费点,nc个转站点,m条线缆。问你输出的最大电量。
输入说明:
前面四个分别表示:发电站的个数,消费点的个数,转站点个数,和线缆数。接下来前m是线缆连接的点数(1,0)代表线缆的两个连接点,再就是n个消费的位置(i)和需求。
最后就是转站点的位置(i)和最大流通量。
把发电站看成源点,消费点看成汇点。
ACcode:
#pragma warning(disable:4786)//使命名长度不受限制
#pragma comment(linker, "/STACK:102400000,102400000")//手工开栈
#include <map>
#include <set>
#include <queue>
#include <cmath>
#include <stack>
#include <cctype>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#define rd(x) scanf("%d",&x)
#define rd2(x,y) scanf("%d%d",&x,&y)
#define rds(x) scanf("%s",x)
#define rdc(x) scanf("%c",&x)
#define ll long long int
#define maxn 100005
#define mod 1000000007
#define INF 0x3f3f3f3f //int 最大值
#define FOR(i,f_start,f_end) for(int i=f_start;i<=f_end;++i)
#define MT(x,i) memset(x,i,sizeof(x))
#define PI acos(-1.0)
#define E exp(1)
using namespace std;
struct Edge{
int to,next;
int w;
}e[maxn];
int head[maxn],level[maxn];
int tot,n;
void addEdge(int u,int v,int w){
e[tot].to=v;e[tot].w=w;e[tot].next=head[u];head[u]=tot++;
e[tot].to=u;e[tot].w=0;e[tot].next=head[v];head[v]=tot++;
}
bool makelevel(int s,int t){
int w;
MT(level,-1);
int que[maxn];
int front=0,rear=0;
que[rear++]=s;
level[s]=0;
while(front!=rear){
int u=que[front++];
for(int k=head[u];k!=-1;k=e[k].next){
int v=e[k].to;
if(e[k].w>0&&level[v]==-1){
level[v]=level[u]+1;
que[rear++]=v;
if(v==t)return true;
}
}
}
return false;
}
int dfs(int now,int maxf,int t){
if(now==t)return maxf;
int a=0;
for(int k=head[now];k!=-1;k=e[k].next){
int v=e[k].to;
int w=e[k].w;
if(w>0&&level[v]==level[now]+1&&(a=dfs(v,min(maxf,w),t))){
e[k].w-=a;
e[k^1].w+=a;
return a;
}
}
level[now]=-1;
return 0;
}
int dinic(int s,int t){
int ans=0,a;
while(makelevel(s,t)){
while(a=dfs(s,INF,t))ans+=a;
}
return ans;
}
int main(){
int u,v,w,n,np,nc,m;
while(scanf("%d%d%d%d",&n,&np,&nc,&m)!=EOF){
tot=0;
MT(head,-1);
FOR(i,1,m){
scanf(" (%d,%d)%d",&u,&v,&w);
addEdge(++u,++v,w);
}
FOR(i,1,np){
scanf(" (%d)%d",&u,&w);
addEdge(0,++u,w);
}
FOR(i,1,nc){
scanf(" (%d)%d",&u,&w);
addEdge(++u,n+1,w);
}
printf("%d\n",dinic(0,n+1));
}
return 0;
}
/*
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
0 0 0 0
1 1 0 0 (0)1
1 0 1 0 (0)1
2 1 1 0 (0)1 (1)1
5 1 1 5
(0,1)20 (1,2)30 (2,3)30 (3,4)10 (3,1)30
(0)100 (4)100
5 1 1 7
(0,1)14 (0,2)12
(1,3)8
(2,1)5 (2,4)16
(3,2)7 (3,4)10
(0)100 (4)100
6 1 1 10
(0,1)16 (0,2)13
(1,2)10 (1,3)12
(2,1)4 (2,4)14
(3,2)9 (3,5)20
(4,3)7 (4,5)4
(0)100 (5)100
11 1 1 21
(0,1)30 (0,2)5 (0,3)20 (0,5)5 (0,10)100
(1,4)10 (1,8)10
(2,5)10
(3,2)5 (3,6)20
(4,7)20
(5,5)60 (5,6)40 (5,10)20
(6,9)40
(8,2)15 (8,4)10 (8,5)10 (8,7)5
(9,8)30 (9,10)10
(0)1000 (10)1000
11 1 3 22
(0,1)30 (0,2)5 (0,3)20 (0,5)5 (0,10)100
(1,4)10 (1,8)10
(2,5)10
(3,2)5 (3,6)20
(4,7)20
(5,5)60 (5,6)40 (5,10)20
(6,9)40
(7,0)20
(8,2)15 (8,4)10 (8,5)10 (8,7)5
(9,8)30 (9,10)10
(0)1000 (5)1000 (7)1000 (10)1000
*/