题目链接: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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-16 02:52:02