题目的意思是: 有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 */