poj1459网络流之多源点最大流

这题想了好久,一直认为应该bfs更新后求最小值把发电站最大发电加进去,但是又发现这样求增广路的时候会导致用户更新出错,

加源点和汇点也考虑到了,没想到居然发电量就是超级源到源点的v,居然这么简单@。@

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cassert>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pi acos(-1)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#pragma comment(linker, "/STACK:1024000000,1024000000")

using namespace std;

const double g=10.0,eps=1e-9;
const int N=100+10,maxn=16,inf=9999999;

int v[N][N],s,t,n;
int pre[N];
bool vis[N];
bool bfs()
{
    memset(vis,0,sizeof vis);
    memset(pre,0,sizeof pre);
    vis[s]=1;
    queue<int>q;
    q.push(s);
    while(!q.empty()){
        int x=q.front();
        if(x==t)return 1;
        q.pop();
        for(int i=0;i<=n+1;i++)
        {
            if(!vis[i]&&v[x][i])
            {
                vis[i]=1;
                q.push(i);
                pre[i]=x;
            }
        }
    }
    return 0;
}
int max_flow()
{
    int ans=0;
    while(1){
        if(!bfs())return ans;
        int minn=inf+1;
        for(int i=t;i!=s;i=pre[i])
            minn=min(minn,v[pre[i]][i]);
        for(int i=t;i!=s;i=pre[i])
        {
            v[pre[i]][i]-=minn;
            v[i][pre[i]]+=minn;
        }
        ans+=minn;
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int np,nc,m;
    while(cin>>n>>np>>nc>>m){
        memset(v,0,sizeof v);
        int a,b,c;
        char ru;
        while(m--){
            cin>>ru;
            cin>>a;
            cin>>ru;
            cin>>b;
            cin>>ru;
            cin>>c;
            v[a][b]+=c;
        }
        while(np--){
            cin>>ru;
            cin>>a;
            cin>>ru;
            cin>>b;
            v[n][a]=b;
        }
        while(nc--){
            cin>>ru;
            cin>>a;
            cin>>ru;
            cin>>b;
            v[a][n+1]=b;
        }
        s=n,t=n+1;
        cout<<max_flow()<<endl;
    }
    return 0;
}

时间: 2024-11-09 04:47:48

poj1459网络流之多源点最大流的相关文章

【算法?日更?第三十三期】网络流基础知识(最大流)

▎写在前面 小编早就听说过了网络流这种神奇的东西,一直以为很高端大气上档次,但是很难,就没学. 今日一见也不过如此,一点也不高端,不大气,不上档次. ▎网络流 ?『定义』 网络流(network-flows)是一种类比水流的解决问题方法,与线性规划密切相关.网络流的理论和应用在不断发展,出现了具有增益的流.多终端流.多商品流以及网络流的分解与合成等新课题.网络流的应用已遍及通讯.运输.电力.工程规划.任务分派.设备更新以及计算机辅助设计等众多领域.(copy自百度) ?『介绍』 其实上面的度娘写

POJ1459 Power Network(网络最大流)

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

[cogs461] [网络流24题#10] 餐巾 [网络流,最小费用最大流]

建图:从源点向第一层连边,第一层表示当天用掉多少餐巾,第二层表示当天需要多少餐巾,所以注意购买餐巾的边容量为无穷大,要从源点开始连向第二层的点,每天可能有剩余,在第一层内表示为流入第二天的节点.具体见代码,第一次写费用流,不知道模板对不对... #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <cmath> #includ

[网络流]Farm Tour(费用流

Farm Tour 题目描述 When FJ's friends visit him on the farm, he likes to show them around. His farm comprises N (1 <= N <= 1000) fields numbered 1..N, the first of which contains his house and the Nth of which contains the big barn. A total M (1 <= M

《算法问题实战策略》-chaper32-网络流

基本的网络流模型: 在图论这一块初步的应用领域中,两个最常见的关注点,其一时图中的路径长度,也就是我们常说的的最短路径问题,另一个则是所谓的“流问题”. 流问题的基本概念: 首先给出一张图. 其实所谓“网络流”,其模型是非常有现实意义的.我们将该图视为计算机网络结构.此图中,s称其为源点而t称其为汇点.这个图中剩余的源泉代表网络设备,连接个顶点的边线表示连接两个设备的数据线缆,边的权值表示这条线缆能够传输的最大数据. 首先我们应该能够注意到,有向路径<s,t>就是一条传输路线,而这条传输数据的

BZOJ 1061 志愿者招募(最小费用最大流)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1061 题意:申奥成功后,布布经过不懈努力,终于 成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难题:为即将启动的奥运新项目招募一批短期志愿者.经过估算,这个项目需要N 天才能完成,其中第i 天至少需要Ai 个人. 布布通过了解得知,一共有M 类志愿者可以招募.其中第i 类可以从第Si 天工作到第Ti 天,招募费用是每人Ci 元.新官上任三把火,为了出色地完成自己的工作,布

【HDU 4940】Destroy Transportation system(数据水/无源无汇带上下界可行流)

Description Tom is a commander, his task is destroying his enemy’s transportation system. Let’s represent his enemy’s transportation system as a simple directed graph G with n nodes and m edges. Each node is a city and each directed edge is a directe

【网络流】网络流小总结

一.dinic最大流 我的模板.模板上已经有了dfs上的优化(比我以前的快多了..)优化啊优化. bool bfs(int st,int ed) { while(!q.empty()) q.pop(); memset(d,-1,sizeof(d)); q.push(st); d[st]=0; while(!q.empty()) { int x=q.front();q.pop(); for(int i=first[x];i!=-1;i=a[i].next) { int y=a[i].y; if(d

【网络流补全计划】Part.Ⅲ有上下界的网络流

本来心情就非常糟糕调月下毛景树把我最后一点写代码的心情调没了 放弃 开始补全网络流. 之前学了普通最大流,那么现在开始补有上下界的网络流. 在普通最大流中,网络里的每一条边都只有流量的上界即边的容量,而引入上下界网络流之后,每个边不但有一个容量,还有一个流量下界. 我们令B(u,v)表示边(u,v)的下界.于是我们可以有表达式: B(u,v)≤f(u,v)≤C(u,v) 有这个式子可以得到 0≤f(u,v)≤C(u,v)?B(u,v) 至此,我们可以将有上下界的网络流分为几种问题来对待,接下来就