最大流-POJ-1459-Power Network
来源:互联网 发布:911segg.info新域名 编辑:程序博客网 时间:2024/06/05 00:28
Power Network
Time Limit: 2000MS Memory Limit: 32768K
Total Submissions: 26592 Accepted: 13821
Description
A power network consists of nodes (power stations, consumers and dispatchers) connected by power transport lines. A node u may be supplied with an amount s(u) >= 0 of power, may produce an amount 0 <= p(u) <= pmax(u) of power, may consume an amount 0 <= c(u) <= min(s(u),cmax(u)) of power, and may deliver an amount d(u)=s(u)+p(u)-c(u) of power. The following restrictions apply: c(u)=0 for any power station, p(u)=0 for any consumer, and p(u)=c(u)=0 for any dispatcher. There is at most one power transport line (u,v) from a node u to a node v in the net; it transports an amount 0 <= l(u,v) <= lmax(u,v) of power delivered by u to v. Let Con=Σuc(u) be the power consumed in the net. The problem is to compute the maximum value of Con.
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
There are several data sets in the input. Each data set encodes a power network. It starts with four integers: 0 <= n <= 100 (nodes), 0 <= np <= n (power stations), 0 <= nc <= n (consumers), and 0 <= m <= n^2 (power transport lines). Follow m data triplets (u,v)z, where u and v are node identifiers (starting from 0) and 0 <= z <= 1000 is the value of lmax(u,v). Follow np doublets (u)z, where u is the identifier of a power station and 0 <= z <= 10000 is the value of pmax(u). The data set ends with nc doublets (u)z, where u is the identifier of a consumer and 0 <= z <= 10000 is the value of cmax(u). All input numbers are integers. Except the (u,v)z triplets and the (u)z doublets, which do not contain white spaces, white spaces can occur freely in input. Input data terminate with an end of file and are correct.
Output
For each data set from the input, the program prints on the standard output the maximum amount of power that can be consumed in the corresponding network. Each result has an integral value and is printed from the beginning of a separate line.
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
Hint
The sample input contains two data sets. The first data set encodes a network with 2 nodes, power station 0 with pmax(0)=15 and consumer 1 with cmax(1)=20, and 2 power transport lines with lmax(0,1)=20 and lmax(1,0)=10. The maximum value of Con is 15. The second data set encodes the network from figure 1.
题意:
一个供能网有n个点,每个可能为供能点、耗能点或是中转站。现在有np个供能点,nc个耗能点,以及他们的编号和供能、耗能数据,还给出了点与点之间的供能边。求最大能让整个网络消耗多少电能。
题解:
读题真是花去不少功夫,一开始理解错了题意还想着拆点,读对题后其实就是个最基本的最大流。
对于供能点,从源点连一条上界为p的供能边到该点。对于耗能点,从耗能点连一条上界为c的供能边到汇点。然后再把点与点之间的供能边加进去,跑一次最大流就可以了。
需要注意的是这里的输入比较麻烦,参考discuss区采用了scanf+sscanf的方法。
#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <algorithm>#include <vector>#include <map>#include <queue>#include <set>#include <string>using namespace std;int n,np,nc,m;const int MAXN = 100010;//点数的最大值const int MAXM = 400010;//边数的最大值const int INF = 0x3f3f3f3f;struct Edge{ int to,next,cap,flow;} edge[MAXM]; //注意是MAXMint tol;int head[MAXN];int gap[MAXN],dep[MAXN],cur[MAXN];void init(){ tol = 0; memset(head,-1,sizeof(head));}void addedge(int u,int v,int w,int rw = 0){ edge[tol].to = v; edge[tol].cap = w; edge[tol].flow = 0; edge[tol].next = head[u]; head[u] = tol++; edge[tol].to = u; edge[tol].cap = rw; edge[tol].flow = 0; edge[tol].next = head[v]; head[v] = tol++;}int Q[MAXN];void BFS(int start,int end){ memset(dep,-1,sizeof(dep)); memset(gap,0,sizeof(gap)); gap[0] = 1; int front = 0, rear = 0; dep[end] = 0; Q[rear++] = end; while(front != rear) { int u = Q[front++]; for(int i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].to; if(dep[v] != -1)continue; Q[rear++] = v; dep[v] = dep[u] + 1; gap[dep[v]]++; } }}int S[MAXN];int sap(int start,int end,int N){ BFS(start,end); memcpy(cur,head,sizeof(head)); int top = 0; int u = start; int ans = 0; while(dep[start] < N) { if(u == end) { int Min = INF; int inser; for(int i = 0; i < top; i++) if(Min > edge[S[i]].cap - edge[S[i]].flow) { Min = edge[S[i]].cap - edge[S[i]].flow; inser = i; } for(int i = 0; i < top; i++) { edge[S[i]].flow += Min; edge[S[i]^1].flow -= Min; } ans += Min; top = inser; u = edge[S[top]^1].to; continue; } bool flag = false; int v; for(int i = cur[u]; i != -1; i = edge[i].next) { v = edge[i].to; if(edge[i].cap - edge[i].flow && dep[v]+1 == dep[u]) { flag = true; cur[u] = i; break; } } if(flag) { S[top++] = cur[u]; u = v; continue; } int Min = N; for(int i = head[u]; i != -1; i = edge[i].next) if(edge[i].cap - edge[i].flow && dep[edge[i].to] < Min) { Min = dep[edge[i].to]; cur[u] = i; } gap[dep[u]]--; if(!gap[dep[u]])return ans; dep[u] = Min + 1; gap[dep[u]]++; if(u != start)u = edge[S[--top]^1].to; } return ans;}int main(){ char temp[100]; int a,b,c; while(scanf("%d%d%d%d",&n,&np,&nc,&m)!=EOF) { init(); for(int i=0; i<m; i++) { scanf("%s",temp);sscanf(temp,"(%d,%d)%d",&a,&b,&c); addedge(a,b,c); } for(int i=0; i<np; i++) { scanf("%s",temp);sscanf(temp,"(%d)%d",&a,&b); addedge(n,a,b); } for(int i=0; i<nc; i++) { scanf("%s",temp);sscanf(temp,"(%d)%d",&a,&b); addedge(a,n+1,b); } cout << sap(n,n+1,n+2) << endl; } return 0;}
- (最大流) poj 1459 Power Network
- POJ--1459[Power Network] 网络最大流
- POJ-1459 Power Network【最大流】
- POJ 1459 Power Network 最大流
- poj 1459 Power Network(最大流)
- poj 1459 Power Network(最大流)
- Poj 1459 Power Network 最大流
- poj 1459 Power Network, 最大流,多源多汇
- POJ 1459 Power Network(最大流)
- POJ 1459 :Power Network:最大流算法
- POJ 1459 Power Network (最大流)
- 【最大流】POJ-1459 Power Network
- poj 1459 Power Network (网络最大流)
- poj 1459 Power Network(最大流)
- POJ 1459 Power Network【多源汇点最大流】
- poj 1459 Power Network (最大流)
- POJ 1459 Power Network(最大流)
- POJ 1459 Power Network(最大流)
- 菜单栏垂直导航
- phpstrom cvs subversion隐藏
- 51Nod-1004-n^n的末位数字
- 数据库--ORCAL--day01
- 项目30- 点-圆-圆柱类族的设计
- 最大流-POJ-1459-Power Network
- GETTING STARTED WITH PICAMERA(python picamera入门)
- git实用说明
- WCF服务寄宿IIS与Windows服务 - C#/.NET
- ppt中怎么利用符号做出分层显示效果?
- 堆的相关知识
- HDU 5073 Galaxy(数学)
- config libigl in qt through cmake under ubuntu
- openat函数用法示例