【CODEVS1993】【网络流】草地排水

题目描述
Description

在农夫约翰的农场上,每逢下雨,Bessie最喜欢的三叶草地就积聚了一潭水。这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间。因此,农夫约翰修建了一套排水系统来使贝茜的草地免除被大水淹没的烦恼(不用担心,雨水会流向附近的一条小溪)。作为一名一流的技师,农夫约翰已经在每条排水沟的一端安上了控制器,这样他可以控制流入排水沟的水流量。

农夫约翰知道每一条排水沟每分钟可以流过的水量,和排水系统的准确布局(起点为水潭而终点为小溪的一张网)。需要注意的是,有些时候从一处到另一处不只有一条排水沟。

根据这些信息,计算从水潭排水到小溪的最大流量。对于给出的每条排水沟,雨水只能沿着一个方向流动,注意可能会出现雨水环形流动的情形。

输入描述
Input Description

第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)是这条排水沟的最大容量。

输出描述
Output Description

输出一个整数,即排水的最大流量。

样例输入
Sample Input

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

样例输出
Sample Output

50

USACO的模板题= =拿来练手

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAXN 2048
#define MAXINT 0x7fffffff
using namespace std;
int n,m;//点的数目和边的数目
int dis[MAXN+1];//距离标号
int num[MAXN+1];
int src,des;//src源点,des汇点
int u,v,w;
struct edge
{
	int f;//某条弧当前流量
	int c;//容量
	int ver;//弧的起点
	edge *rev;//反弧
	edge *next;//弧的终点
	edge(){};
	edge(int v,int cap,edge *nex):ver(v),c(cap),next(nex),rev(NULL),f(0){};
	void* operator new(size_t, void *p)
	{
 		return p;
 	}
}*s[MAXN+1];
void init()
{
	int queue[MAXN+1],head=0,tail=0;
	for (int i=1;i<=n;i++)
	    dis[i]=MAXN,num[i]=0;
	queue[tail++]=des;
	dis[des]=0;
	num[0]=1;
	while (head!=tail)
	{
		int v=queue[head++];
		edge *e=s[v];
		while (e)
		{
			if ((e->rev)&&(e->rev->c==0)||dis[e->ver]<MAXN) {}//若改点后的边不可通过
			//流或者已经更新就无需更新
			else
			{
				dis[e->ver]=dis[v]+1;
				++num[dis[e->ver]];
				queue[tail++]=e->ver;
			}
			e=e->next;
		}
	}
}
int maxflow()//ISAP算法实现过程
{
	int st=src,ret=0;
	edge *E[MAXN],*rep[MAXN];
	for (int i=1;i<=n;i++) E[i]=s[i];
	while (dis[src]<n)//不存在增广路径就停止
	{
		if (st==des)//找到了增广路径
		{
			int delta=MAXINT;
			for (int i=src;i!=des;i=E[i]->ver)
				delta=min(delta,E[i]->c);
			for (int i=src;i!=des;i=E[i]->ver)
			{
				E[i]->c-=delta;
				E[i]->f+=delta;
				E[i]->rev->c+=delta;
				E[i]->rev->f-=delta;
			}
			ret+=delta;
			st=src;
		}
		edge *e;
		for (e=E[st];e;e=e->next)
			if (e->c>0&&dis[st]==dis[e->ver]+1) break;
		if (e)//存在允许弧
		{
			E[st]=e;
			rep[e->ver]=e->rev;
			st=e->ver;
		}
		else
		{
			if ((--num[dis[st]])==0) break;//GAP优化
			E[st]=s[st];
			int mind=n;
			for (edge *t=s[st];t;t=t->next)
				if (t->c>0)
				    mind=min(mind,dis[t->ver]);
			dis[st]=mind+1;
			++num[dis[st]];
			if (st!=src) st=rep[st]->ver;
		}
    }
	return ret;
}
int main()
{
	freopen("ditch.in","r",stdin);
	freopen("ditch.out","w",stdout);
	scanf("%d%d",&m,&n);
	src=1,des=n;
	edge *buffer=new edge[2*m];
 	edge *data=buffer;
	while (m--)
	{
		scanf("%d%d%d",&u,&v,&w);
		s[u]=new((void*) data++) edge(v,w,s[u]);
		s[v]=new((void*) data++) edge(u,0,s[v]);
		s[u]->rev=s[v];
		s[v]->rev=s[u];
	}
	init();
	printf("%d",maxflow());
}
时间: 2024-10-14 06:09:46

【CODEVS1993】【网络流】草地排水的相关文章

codevs1993 草地排水(最大流)

1993 草地排水 USACO 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在农夫约翰的农场上,每逢下雨,Bessie最喜欢的三叶草地就积聚了一潭水.这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间.因此,农夫约翰修建了一套排水系统来使贝茜的草地免除被大水淹没的烦恼(不用担心,雨水会流向附近的一条小溪).作为一名一流的技师,农夫约翰已经在每条排水沟的一端安上了控制器,这样他可以控制流入排水沟的水流量. 农

codevs 1993草地排水

1993 草地排水 题目描述 Description 在农夫约翰的农场上,每逢下雨,Bessie最喜欢的三叶草地就积聚了一潭水.这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间.因此,农夫约翰修建了一套排水系统来使贝茜的草地免除被大水淹没的烦恼(不用担心,雨水会流向附近的一条小溪).作为一名一流的技师,农夫约翰已经在每条排水沟的一端安上了控制器,这样他可以控制流入排水沟的水流量. 农夫约翰知道每一条排水沟每分钟可以流过的水量,和排水系统的准确布局(起点为水潭而终点为小溪的一张网).

luogu P2740 [USACO4.2]草地排水Drainage Ditches

P2740 [USACO4.2]草地排水Drainage Ditches 2017-09-17 题目背景 在农夫约翰的农场上,每逢下雨,贝茜最喜欢的三叶草地就积聚了一潭水.这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间.因此,农夫约翰修建了一套排水系统来使贝茜的草地免除被大水淹没的烦恼(不用担心,雨水会流向附近的一条小溪).作为一名一流的技师,农夫约翰已经在每条排水沟的一端安上了控制器,这样他可以控制流入排水沟的水流量. 题目描述 农夫约翰知道每一条排水沟每分钟可以流过的水量,和

【题解】CODEVS 1993 草地排水

CODEVS 1993 草地排水 Description 在农夫约翰的农场上,每逢下雨,Bessie最喜欢的三叶草地就积聚了一潭水.这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间.因此,农夫约翰修建了一套排水系统来使贝茜的草地免除被大水淹没的烦恼(不用担心,雨水会流向附近的一条小溪).作为一名一流的技师,农夫约翰已经在每条排水沟的一端安上了控制器,这样他可以控制流入排水沟的水流量. 农夫约翰知道每一条排水沟每分钟可以流过的水量,和排水系统的准确布局(起点为水潭而终点为小溪的一张网

【USACO】草地排水

Drainage Ditches 草地排水 usaco 4.2.1描述在农夫约翰的农场上,每逢下雨,Bessie最喜欢的三叶草地就积聚了一潭水.这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间.因此,农夫约翰修建了一套排水系统来使贝茜的草地免除被大水淹没的烦恼(不用担心,雨水会流向附近的一条小溪).作为一名一流的技师,农夫约翰已经在每条排水沟的一端安上了控制器,这样他可以控制流入排水沟的水流量.农夫约翰知道每一条排水沟每分钟可以流过的水量,和排水系统的准确布局(起点为水潭而终点为小

CODEVS-1993 草地排水

题目描述 Description 在农夫约翰的农场上,每逢下雨,Bessie最喜欢的三叶草地就积聚了一潭水.这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间.因此,农夫约翰修建了一套排水系统来使贝茜的草地免除被大水淹没的烦恼(不用担心,雨水会流向附近的一条小溪).作为一名一流的技师,农夫约翰已经在每条排水沟的一端安上了控制器,这样他可以控制流入排水沟的水流量. 农夫约翰知道每一条排水沟每分钟可以流过的水量,和排水系统的准确布局(起点为水潭而终点为小溪的一张网).需要注意的是,有些时

USACO草地排水-网络流dinic模板

广搜计算层次图,在层次图上深搜.标准dinic模板. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<vector> 5 #include<queue> 6 #include<cmath> 7 #include<algorithm> 8 #include<string.h> 9 #define INF 0x7fffff

[USACO4.2]草地排水Drainage Ditches

题目背景 在农夫约翰的农场上,每逢下雨,贝茜最喜欢的三叶草地就积聚了一潭水.这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间.因此,农夫约翰修建了一套排水系统来使贝茜的草地免除被大水淹没的烦恼(不用担心,雨水会流向附近的一条小溪).作为一名一流的技师,农夫约翰已经在每条排水沟的一端安上了控制器,这样他可以控制流入排水沟的水流量. 题目描述 农夫约翰知道每一条排水沟每分钟可以流过的水量,和排水系统的准确布局(起点为水潭而终点为小溪的一张网).需要注意的是,有些时候从一处到另一处不只有

[USACO4.2] 草地排水

题目背景 在农夫约翰的农场上,每逢下雨,贝茜最喜欢的三叶草地就积聚了一潭水.这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间.因此,农夫约翰修建了一套排水系统来使贝茜的草地免除被大水淹没的烦恼(不用担心,雨水会流向附近的一条小溪).作为一名一流的技师,农夫约翰已经在每条排水沟的一端安上了控制器,这样他可以控制流入排水沟的水流量. 题目描述 农夫约翰知道每一条排水沟每分钟可以流过的水量,和排水系统的准确布局(起点为水潭而终点为小溪的一张网).需要注意的是,有些时候从一处到另一处不只有