【USACO4.2】草地排水Drainage Ditches(最大流)
题目背景
在农夫约翰的农场上,每逢下雨,贝茜最喜欢的三叶草地就积聚了一潭水。这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间。因此,农夫约翰修建了一套排水系统来使贝茜的草地免除被大水淹没的烦恼(不用担心,雨水会流向附近的一条小溪)。作为一名一流的技师,农夫约翰已经在每条排水沟的一端安上了控制器,这样他可以控制流入排水沟的水流量。
题目描述
农夫约翰知道每一条排水沟每分钟可以流过的水量,和排水系统的准确布局(起点为水潭而终点为小溪的一张网)。需要注意的是,有些时候从一处到另一处不只有一条排水沟。
根据这些信息,计算从水潭排水到小溪的最大流量。对于给出的每条排水沟,雨水只能沿着一个方向流动,注意可能会出现雨水环形流动的情形。
输入格式:
第1行: 两个用空格分开的整数N (0 <= N <= 200) 和 M (2 <= M <= 200)。N是农夫John已经挖好的排水沟的数量,M是排水沟交叉点的数量。交点1是水潭,交点M是小溪。
第二行到第N+1行: 每行有三个整数,Si, Ei, 和 Ci。Si 和 Ei (1 <= Si, Ei <= M) 指明排水沟两端的交点,雨水从Si 流向Ei。Ci (0 <= Ci <= 10,000,000)是这条排水沟的最大容量。
输出格式:
输出一个整数,即排水的最大流量
输入样例#1:
5 4
1 2 40
1 4 20
2 4 20
2 3 30
3 4 10
输出样例#1:
50
题解
网络流最大流的模板题
直接使用EK/Dinic/FF(这个不保证能够过)即可
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
using namespace std;
#define MAX 10100
#define MAXL 210000
#define rg register
#define INF 1000000000
inline int read()
{
	   rg int x=0,t=1;rg char ch=getchar();
	   while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
	   if(ch=='-'){t=-1;ch=getchar();}
	   while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	   return x*t;
}
int N,M,S,T,Ans=0;
int a[MAX];
queue<int> Q;
int pre[MAXL];
struct Line
{
	   int u,v,next,w,c,fb;//w是流量,c是容量
}e[MAXL];
int h[MAX],cnt=1;
inline void Add(rg int u,rg int v,rg int w)
{
	    e[cnt]=(Line){u,v,h[u],0,w,cnt+1};
	    h[u]=cnt++;
	    e[cnt]=(Line){v,u,h[v],0,0,cnt-1};//存反边
	    h[v]=cnt++;
}
int main()
{
		M=read();N=read();S=1;T=N;
		for(rg int i=1;i<=M;++i)
		{
			   rg int u=read(),v=read(),w=read();
			   Add(u,v,w);
		}
		rg int Ans=0;
		while(1)//不断寻找增广路径
		{
			   for(rg int i=1;i<=N;++i)a[i]=0;
			   while(!Q.empty())Q.pop();
			   Q.push(S);
			   pre[S]=0;
			   a[S]=INF;
			   while(!Q.empty())
			   {
			   	     int u=Q.front();Q.pop();
			   	     for(int i=h[u];i;i=e[i].next)
			   	     {
			   	     	   int v=e[i].v;
			   	     	   if(!a[v]&&e[i].c>e[i].w)//可以增广
			   	     	   {
			   	     	   	    a[v]=min(a[u],e[i].c-e[i].w);//求最小的流量
								pre[v]=i;//储存增广路径
								Q.push(v);
			   	     	   }
			   	     }
			   	     if(a[T])break;//增广到了终点
			   }
			   if(!a[T])break;//未增广
			   for(int u=T;u!=S;u=e[pre[u]].u)//增加流量
			   {
			   	      e[pre[u]].w+=a[T];
			   	      e[e[pre[u]].fb].w-=a[T];
			   }
			   Ans+=a[T];
		}
		printf("%d\n",Ans);
		return 0;
}
												
											【USACO4.2】草地排水Drainage Ditches(最大流)的更多相关文章
- [USACO4.2] 草地排水 Drainage Ditches (最大流)
		
题目背景 在农夫约翰的农场上,每逢下雨,贝茜最喜欢的三叶草地就积聚了一潭水.这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间.因此,农夫约翰修建了一套排水系统来使贝茜的草地免除被大水淹没 ...
 - luogu2740 [USACO4.2]草地排水Drainage Ditches 最大流EK
		
练一下最大流 #include <iostream> #include <cstring> #include <cstdio> #include <queue ...
 - 最大流 [USACO4.2]草地排水Drainage Ditches
		
Background 在农夫约翰的农场上,每逢下雨,贝茜最喜欢的三叶草地就积聚了一潭水.这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间.因此,农夫约翰修建了一套排水系统来使贝茜的草地免 ...
 - [USACO4.2]草地排水Drainage Ditches
		
题目背景 在农夫约翰的农场上,每逢下雨,贝茜最喜欢的三叶草地就积聚了一潭水.这意味着草地被水淹没了,并且小草 要继续生长还要花相当长一段时间.因此,农夫约翰修建了一套排水系统来使贝茜的草地免除被大水淹 ...
 - 洛谷P2740 [USACO4.2]草地排水Drainage Ditches
		
题目背景 在农夫约翰的农场上,每逢下雨,贝茜最喜欢的三叶草地就积聚了一潭水.这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间.因此,农夫约翰修建了一套排水系统来使贝茜的草地免除被大水淹没 ...
 - 【网络流】[USACO4.2]草地排水Drainage Ditches
		
用EdmondsKarp可过 题目背景 在农夫约翰的农场上,每逢下雨,贝茜最喜欢的三叶草地就积聚了一潭水.这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间.因此,农夫约翰修建了一套排水系 ...
 - P2740 [USACO4.2]草地排水Drainage Ditches
		
题目背景 在农夫约翰的农场上,每逢下雨,贝茜最喜欢的三叶草地就积聚了一潭水.这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间.因此,农夫约翰修建了一套排水系统来使贝茜的草地免除被大水淹没 ...
 - luogu P2740 [USACO4.2]草地排水Drainage Ditches |网络流
		
题目背景 在农夫约翰的农场上,每逢下雨,贝茜最喜欢的三叶草地就积聚了一潭水.这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间.因此,农夫约翰修建了一套排水系统来使贝茜的草地免除被大水淹没 ...
 - POJ-1273   Drainage Ditches   最大流Dinic
		
Drainage Ditches Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 65146 Accepted: 25112 De ...
 
随机推荐
- 一、scrapy的下载安装---Windows(安装软件太让我伤心了)
			
写博客就和笔记一样真的很有用,你可以随时的翻阅.爬虫的爬虫原理与数据抓取.非结构化与结构化数据提取.动态HTML处理和简单的图像识别已经学完,就差整理博客了 开始学习scrapy了,所以重新建了个分类 ...
 - R语言-主成分分析
			
1.PCA 使用场景:主成分分析是一种数据降维,可以将大量的相关变量转换成一组很少的不相关的变量,这些无关变量称为主成分 步骤: 数据预处理(保证数据中没有缺失值) 选择因子模型(判断是PCA还是EF ...
 - jquary 单选,多选,select 获取和设置值  jquary自定义函数
			
<%@ page contentType="text/html; charset=UTF-8"%> <%@ taglib prefix="c" ...
 - [Python Study Notes]CS架构远程访问获取信息--SERVER端v2.0
			
更新内容: 1.增加内存信息获取 2.增加电池信息获取 3.增加磁盘信息获取 4.重新布局窗体 5.增加窗体名称 6.增加连接成功之前,不可按压 ''''''''''''''''''''''''''' ...
 - ucore文件系统详解
			
最近一直在mooc上学习清华大学的操作系统课程,也算是复习下基本概念和原理,为接下来的找工作做准备. 每次深入底层源码都让我深感操作系统实现的琐碎,即使像ucore这样简单的kernel也让我烦躁不已 ...
 - 《HelloGitHub》第 23 期
			
公告 新的一年,不忘初心,从新开始.加油! <HelloGitHub>第 23 期 兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的 ...
 - 麻省理工18年春软件构造课程阅读02“Java基础”
			
本文内容来自MIT_6.031_sp18: Software Construction课程的Readings部分,采用CC BY-SA 4.0协议. 由于我们学校(哈工大)大二软件构造课程的大部分素材 ...
 - Java文件复制与读写
			
函数介绍 public String readLine():每次读取文件的一行,当文件读取完毕时,返回null public int read(byte[] b):将文件内容读取到字节数组b ...
 - POJ - 3087 模拟 [kuangbin带你飞]专题一
			
模拟洗牌的过程,合并两堆拍的方式:使先取s2,再取s1:分离成两堆的方式:下面C张放到s1,上面C张到s2.当前牌型与第一次相同时,说明不能搜索到答案. AC代码 #include<cstdio ...
 - LOJ6000 - 「网络流 24 题」搭配飞行员
			
原题链接 题意简述 求二分图的最大匹配. 题解 这里写的是匈牙利算法. 表示节点的当前匹配. 为真表示在这一轮匹配中,无法给节点一个新的匹配.所以如果为真就不用再dfs它了,直接continue就好. ...