码迷,mamicode.com
首页 > Web开发 > 详细

POJ1459-Power Network-网络流-最大流(EK模板题)

时间:2015-08-30 17:39:10      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:poj1459   最大流模板题   

题目链接: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;
}


 

版权声明:本文为博主原创文章,未经博主允许不得转载。

POJ1459-Power Network-网络流-最大流(EK模板题)

标签:poj1459   最大流模板题   

原文地址:http://blog.csdn.net/wlxsq/article/details/48105741

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!