题目链接:http://poj.org/problem?id=1459
好吧,其实就是一道模板题。。。
但是写的那么长的鸟语。。。orz...各种揣度题目意思。。。。
造福一下大家,我把题目数据的意思说一下,就不用看这可恶的英文了。。。
题目意思:给几个发电站,给几个消耗站,再给几个转发点。发电站只发电,消耗站只消耗电,转发点只是转发电,再给各个传送线的传电能力。问你消耗站能获得的最多电是多少。
首先输入四个数据,分别表示节点数量,发电站的数量,消耗站的数量,以及转发点的数量。
接下来的是m个转发点,(a,b)c.表示的是点a到b最大可以传输c的流量。
然后是np个发电站,(a)b,表示的是发电站a最大可以发电b容量.
最后是数据nc个消耗站。(a)b.表示的是消耗站a最大可以消耗b容量。
最后问你,从发电站出发,到消耗站,最大可以传输多大的流量。
很显然,这是一个最大流的模板题,我们只要加上超级源点和汇点即可。把所给的发电站都和超级源点相连,把所给的消耗战都和超级汇点相连。。问题就可以迎刃而解了
#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<map>
#include<queue>
#include<cmath>
#include<stack>
#include<set>
#include<vector>
#include<algorithm>
#define LL long long
#define inf 1<<29
#define s(a) scanf("%d",&a)
#define CL(a,b) memset(a,b,sizeof(a))
using namespace std;
const int N=210;
int n,m,np,nc,a,b,c;
int start,endd;
int Map[N][N]; // 额定最大容量;
int path[N]; // 传输的路径;
int flow[N]; // 当前该条路径可传输的流量;
int bfs()
{ // 广搜,寻找可行路劲;
queue<int>q;
CL(path,-1);
path[start]=0;flow[start]=inf;
q.push(start);
while(!q.empty()){
int t=q.front();
q.pop();
if(t==endd) break;
for(int i=1;i<=n;i++){
if(i!=start&&path[i]==-1&&Map[t][i]){
flow[i]=flow[t]>Map[t][i]?Map[t][i]:flow[t];
q.push(i);
path[i]=t;
}
}
}
if(path[endd]==-1) return -1; // 表示没有找到可行路径;
else return flow[endd];
}
int Edmonds_Karp()
{ // 对每条路径增加反向边;
int max_flow=0,step,now,pre;
while((step=bfs())!=-1){ // 没找到一条可行路径,更新最大流以及他的反向边;
max_flow+=step;
now=endd;
while(now!=start){
pre=path[now];
Map[pre][now]-=step;
Map[now][pre]+=step;
now=pre;
}
}
return max_flow;
}
int main()
{
cin.sync_with_stdio(false);
while(cin>>n>>np>>nc>>m){
CL(Map,0);
char d;
for(int i=0;i<m;i++){
cin>>d>>a>>d>>b>>d>>c;
Map[a+1][b+1]=c;
}
int tmp=n+1; // 超级汇点;
n+=2; // 总节点数U;
m+=(np+nc); // 总边数V;
for(int i=0;i<np;i++){
cin>>d>>a>>d>>b;
Map[0][a+1]=b;
}
for(int i=0;i<nc;i++){
cin>>d>>a>>d>>b;
Map[a+1][tmp]=b;
}
start=0;endd=tmp;
cout<<Edmonds_Karp()<<endl;
}
return 0;
}