zoukankan      html  css  js  c++  java
  • USACO93网络流入门Drainage Ditches 排水渠(DCOJ 5130)

    题目描述

    (传送门:http://poj.org/problem?id=1273翻译 by sxy(AFO的蒟蒻))

    每次约翰的农场下雨,Bessie的水池里的四叶草就会被弄破。这就意味着,这些四叶草又会被水淹没,并且会花费很长一段时间才能重新生长好。因此,约翰后来就架设了一套排水系统,这样一来Bessie的四叶草就不会因为下雨而被水淹没破坏了,雨水会通过排水渠流向附近的小溪。作为一个专业的工程师,约翰也在每一条排水渠的开头,安装了一个流量控制器,这样一来他就能控制让多少水流通过这条水渠。

    约翰不仅仅知道每分钟每条排水渠能运输多少加仑的水,而且约翰还精心布置了这些排水渠,使得这些水渠之间可以联通,并且构成了一个复杂的网络

    现在给你所有的信息,考虑每分钟最多有多少水能够从水池里面被排到小溪里面。对于任何一条排水渠,里面的水流只能是单向的。但是可能会有些排水渠的构造,可以使得水流在一个环内。

    输入格式

    输入第一行包含两个整数N,M。N表示约翰的农场里的排水渠的数量。M表示这些排水渠之间的交点的个数。特别的,交点1是Bessie的水池,交点M是小溪。接下来的输入有N行,每行有3个整数Si,Ci,Ei (1 <= Si,Ei <= M)描述了Si号交点和Ci号交点之间的排水渠最多够流过Ci的水量

    输出格式

    输出只有1行一个整数,表示每分钟能从水池中流走的最大水流量

    样例

    样例输入

    5 4
    1 2 40
    1 4 20
    2 4 20
    2 3 30
    3 4 10
    

    样例输出

    50
    

    数据范围与提示

    样例解释

    按照如图所示的方式排水,每分钟最大排水量为 50

    数据范围

    1<=N,M<=2001 <= N,M <= 2001<=N,M<=200

    Ci(0,106]

    网络流模板

    //Serene
    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<cstdio>
    #include<cmath>
    using namespace std;
    const int maxn=1000+10,maxm=5000+10;
    int n,m;
    
    int aa;char cc;
    int read() {
    	aa=0;cc=getchar();
    	while(cc<'0'||cc>'9') cc=getchar();
    	while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
    	return aa;
    }
    
    struct Node{
    	int x,y,cap,flow;
    }node[2*maxm];
    
    int cur[maxn];
    int fir[maxn],nxt[2*maxm],e=1;
    void add(int x,int y,int z) {
    	node[++e].x=x;node[e].y=y;node[e].cap=z; nxt[e]=fir[x];fir[x]=e;
    	node[++e].x=y;node[e].y=x;node[e].cap=0; nxt[e]=fir[y];fir[y]=e;
    }
    
    int zz[maxn],dis[maxn],s=1,t=0;
    bool BFS() {
    	memset(dis,-1,sizeof(dis));
    	dis[1]=0; s=1,t=0;zz[++t]=1;
    	int x,y;
    	while(s<=t) {
    		x=zz[s];s++;
    		for(y=fir[x];y;y=nxt[y]) {
    			if(node[y].flow>=node[y].cap||dis[node[y].y]!=-1) continue;
    			dis[node[y].y]=dis[x]+1;
    			zz[++t]=node[y].y;
    		}
    	}
    	return dis[n]!=-1;
    }
    
    int DFS(int pos,int maxf) {
    	if(pos==n||!maxf) return maxf;
    	int rs=0,now;
    	for(int &y=cur[pos];y;y=nxt[y]) {
    		if(node[y].flow>=node[y].cap||dis[node[y].y]!=dis[node[y].x]+1) continue;
    		now=DFS(node[y].y,min(maxf,node[y].cap-node[y].flow));
    		node[y].flow+=now;
    		node[y^1].flow-=now;
    		rs+=now;
    		maxf-=now;
    	}
    	if(!rs) dis[pos]=-1;
    	return rs;
    }
    
    int Dinic() {
    	int rs=0;
    	while(BFS()) {
    		memcpy(cur,fir,sizeof(fir));
    		rs+=DFS(1,0x3f3f3f3f);
    	}
    	return rs;
    }
    
    int main() {
    	int x,y,z;
    	m=read();n=read();
    	for(int i=1;i<=m;++i) {
    		x=read();y=read();z=read();
    		add(x,y,z);
    	}
    	printf("%d",Dinic());
    	return 0;
    }
    

      

    弱者就是会被欺负呀
  • 相关阅读:
    Path Sum
    Binary Tree Level Order Traversal II
    Jump Game
    leedcode 刷题-V2
    (2016 年) githup 博客地址 : https://github.com/JMWY/MyBlog
    算法分类总结
    剑指 Offer 题目汇总索引
    LeedCde 题解目录
    趣味算法总目录
    常用
  • 原文地址:https://www.cnblogs.com/Serene-shixinyi/p/7445384.html
Copyright © 2011-2022 走看看