| Time Limit: 2000MS | Memory Limit: 32768K | |
Description

An example is in figure 1. The label x/y of power station u shows that p(u)=x and pmax(u)=y. The label x/y of consumer u shows that c(u)=x and cmax(u)=y. The label x/y of power transport line (u,v) shows that l(u,v)=x and lmax(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
题意:有多个电站和多个消费者,求消费者消费的最大电能。
可以引入一个超级源点s和一个超级汇点t,源点和每一个电站建一条边,边容量为电站的最大产电量;每个消费者和汇点建一条边,边容量为消费者消费的最大电能。
#include <iostream> #include<cstring> #include<cstdio> using namespace std; const int MAXN=105; const int INF=(1<<29); int level[MAXN]; int flow[MAXN][MAXN]; int s,t,n,np,nc,m; bool bfs() { int queue[MAXN],front,rear; front=rear=0; memset(level,0,sizeof(level)); level[s]=1; queue[rear++]=s; while(front!=rear) { int v=queue[front++]; for(int i=0;i<=n;i++) if(!level[i]&&flow[v][i]) { level[i]=level[v]+1; queue[rear++]=i; } } if(!level[t]) return false; return true; } int dfs(int i,int f) { if(i==t) return f; int sum=0; for(int j=0;f&&j<=n;j++) { if(flow[i][j]&&level[i]+1==level[j]) { int tmp=dfs(j,min(f,flow[i][j])); flow[i][j]-=tmp; flow[j][i]+=tmp; sum+=tmp; f-=tmp; } } return sum; } int dinic() { int maxflow=0; while(bfs()) maxflow+=dfs(s,INF); return maxflow; } void build_graph() { int u,v,f; char str[10]; memset(flow,0,sizeof(flow)); while(m--) { scanf("%s",str); sscanf(str,"(%d,%d)%d",&u,&v,&f); flow[u][v]=f; } while(np--) { scanf("%s",str); sscanf(str,"(%d)%d",&u,&f); flow[s][u]=f; } while(nc--) { scanf("%s",str); sscanf(str,"(%d)%d",&u,&f); flow[u][t]=f; } } int main() { while(~scanf("%d%d%d%d",&n,&np,&nc,&m)) { n++; s=n-1; t=n; build_graph(); printf("%d\n",dinic()); } return 0; } /* 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 */
1536



被折叠的 条评论
为什么被折叠?



