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

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

POJ1459-Power Network-网络流-最大流(EK模板题)的相关文章

POJ 1459 Power Network(网络流 最大流 多起点,多汇点)

Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 22987   Accepted: 12039 Description A power network consists of nodes (power stations, consumers and dispatchers) connected by power transport lines. A node u may be supplied

POJ 1459 Power Network (网络流最大流基础 多源点多汇点 Edmonds_Karp算法)

Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 24056   Accepted: 12564 Description A power network consists of nodes (power stations, consumers and dispatchers) connected by power transport lines. A node u may be supplied

POJ1459 Power Network【最大流】【Edmond-Karp】

第一道网络流题,纪念下~~~ 题目链接: http://poj.org/problem?id=1459 题目大意: 一个电力网络包含很多节点(发电站.消费者以及中转站)和电力传输线.所有发电站不消耗电力, 所有消费者不产生电力,所有中转站不产生也不消耗电力.在网络中,任意两点u和v之间最多只 有一条传输线的存在,且能够从u望v传输最多w单位容量.计算整个网络的最大电力消耗. 思路: 一道非常基础.非常典型的网络流题目.每个发电站当做一个源点,每个消费者当做一个汇点.但 是这样子并不适合任何一种求

网络流--最大流ek模板

标准大白书式模板,代码简单但由于效率并不高,所以并不常用,就是这样 1 #include<stdio.h> 2 #include<string.h> 3 #include<queue> 4 #include<vector> 5 #include<algorithm> 6 using namespace std; 7 const int maxm=150+5; 8 const int INF=0x3f3f3f3f; 9 10 struct edge

poj1459 Power Network --- 最大流 EK/dinic

求从电站->调度站->消费者的最大流,给出一些边上的容量,和电站和消费者可以输入和输出的最大量. 添加一个超级源点和汇点,建边跑模板就可以了.两个模板逗可以. #include <iostream> #include <cstring> #include <string> #include <cstdio> #include <cmath> #include <algorithm> #include <vector&

POJ-1459 Power Network(最大流模板)

题目链接:POJ-1459 Power Network 题意 有$np$个发电站,$nc$个消费者,$m$条有向边,给出每个发电站的产能上限,每个消费者的需求上限,每条边的容量上限,问最大流量. 思路 很裸的最大流问题,源点向发电站连边,边权是产能上限,消费者向汇点连边,边权是需求上限,其余的连边按给出的$m$条边加上去即可. 代码实现 #include <iostream> #include <cstdio> #include <cstring> #include &

Poj1459 Power Network 预流推进

Poj1459 Power Network 预流推进 问题描述: 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 ma

poj459--Power Network(最大流EK、)

Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 23114   Accepted: 12103 Description A power network consists of nodes (power stations, consumers and dispatchers) connected by power transport lines. A node u may be supplied

POJ训练计划1459_Power Network(网络流最大流/Dinic)

解题报告 这题建模实在是好建,,,好贱,,, 给前向星给跪了,纯dinic的前向星竟然TLE,sad,,,回头看看优化,,, 矩阵跑过了,2A,sad,,, /************************************************************************* > File Name: PowerN.cpp > Author: _nplus > Mail: [email protected] > Time: 2014年07月19日 星期