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) <= p max(u) of power, may consume an amount 0 <= c(u) <= min(s(u),c max(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) <= l max(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 p max(u)=y. The label x/y of consumer u shows that c(u)=x and c max(u)=y. The label x/y of power transport line (u,v) shows that l(u,v)=x and l max(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.
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)4Sample Output
15 6HintThe 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.
题意:这题不难,但这个破题死活读不懂(建议出成6级阅读),后来在网上找了找发现有一个人给的解释还比较清晰这里借用一下。
简单的说下题意(按输入输出来讲,前面的描述一堆的rubbish,还用来误导人),给你n个点,其中有np个是能提供电力的点,nc个是能消费电力的点,剩下的点(n-np-nc)是中转战即不提供电力也不消费电力,点与点之间是有线路存在的,有m条线路,每条线路有最多运载限定。
前4个数据就是有n个点,np个供电点,nc个消费点,m条线路,接来题目先给出的是m条线路的数据,(起点,终点)最多运载量,然后是np个供电点的数据(供电点)最多供电量,接着就是nc个消费点的数据(消费点)最多消费电量。
题目要我们求出给定的图最大能消费的总电量(就是求最大流)
题解:
最大流基础题,就不多说了。注意输入就行,因为输入前面空格数量随机所以建议用cin,嫌慢的可以加上
std::ios::sync_with_stdio(false);
不会用的看这 点击打开链接
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 310;
struct Edge{
int to,flow,rev;
Edge(){}
Edge(int a,int b,int c):to(a),flow(b),rev(c){}
};
vector<Edge> E[MAXN];
inline void Add(int from,int to,int flow){
E[from].push_back(Edge(to,flow,E[to].size()));
E[to].push_back(Edge(from,0,E[from].size()-1));
}
int deep[MAXN];
int iter[MAXN];
bool BFS(int from,int to){
memset(deep,-1,sizeof deep);
deep[from] = 0;
queue<int> Q;
Q.push(from);
while(!Q.empty()){
int t = Q.front();
Q.pop();
for(int i=0 ; i<E[t].size() ; ++i){
Edge& e = E[t][i];
if(e.flow > 0 && deep[e.to] == -1){
deep[e.to] = deep[t] + 1;
Q.push(e.to);
}
}
}
return deep[to] != -1;
}
int DFS(int from,int to,int flow){
if(from == to || flow == 0)return flow;
for(int& i=iter[from] ; i<E[from].size() ; ++i){
Edge& e = E[from][i];
if(e.flow > 0 && deep[e.to] == deep[from]+1){
int nowflow = DFS(e.to,to,min(flow,e.flow));
if(nowflow > 0){
e.flow -= nowflow;
E[e.to][e.rev].flow += nowflow;
return nowflow;
}
}
}
return 0;
}
int Dinic(int from,int to){
int sumflow = 0;
while(BFS(from,to)){
memset(iter,0,sizeof iter);
int mid;
while((mid=DFS(from,to,INF)) > 0)sumflow += mid;
}
return sumflow;
}
int main(){
int N,P,C,M;
char rubbish;
int first, next;
int flow;
while(cin>>N>>P>>C>>M){
for(int i=0 ; i<M ; ++i){
cin >> rubbish;
cin >> first;
cin >> rubbish;
cin >> next;
cin >> rubbish;
cin >> flow;
if (first == next)continue;
Add(first,next,flow);
}
for(int i=0 ; i<P ; ++i){
cin >> rubbish;
cin >> first;
cin >> rubbish;
cin >> flow;
Add(MAXN-2,first,flow);
}
for(int i=0 ; i<C ; ++i){
cin >> rubbish;
cin >> first;
cin >> rubbish;
cin >> flow;
Add(first,MAXN-1,flow);
}
printf("%d\n",Dinic(MAXN-2,MAXN-1));
for(int i=0 ; i<MAXN ; ++i)E[i].clear();
}
return 0;
}