• luogu P2740 [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

    说明

    题目翻译来自NOCOW。

    USACO Training Section 4.2

    模板题:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<queue>
    #include<algorithm>
    #define ll long long
    
    using namespace std;
    const int N=300001;
    const int maxn=0x7fffff;
    
    inline int read()
    {
    	int x=0;char c=getchar();
    	while(c<'0'||c>'9')c=getchar();
    	while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
    	return x;
    }
    
    int head[N],dis[N];
    bool vis[N];
    int now=0;
    int n,m,S,T;
    struct node{
    	int u,v,cap,flow,nxt;
    }E[N];
    
    inline void add(int u,int v,int w)
    {
    	E[now].u=u;
    	E[now].v=v;
    	E[now].cap=w;
    	E[now].flow=0;
    	E[now].nxt=head[u];
    	head[u]=now++;
    }
    
    bool bfs(int start,int endd)
    {
    	for(int i=1;i<=n;i++)
    		dis[i]=-1;
    	queue<int>Q;
    	Q.push(start);
    	dis[start]=0;
    	while(!Q.empty())
    	{
    		int topp=Q.front();
    		Q.pop();
    		for(int i=head[topp];~i;i=E[i].nxt)
    		{
    			if(dis[E[i].v]==-1&&E[i].cap>E[i].flow)
    			{
    				vis[E[i].v]=1;
    				dis[E[i].v]=dis[topp]+1;
    				Q.push(E[i].v);
    			}
    		}
    	}
    	if(dis[endd]==-1)
    		return 0;
    	return 1;
    }
    
    int dfs(int start,int minn)
    {
    	if(start==T||minn<=0)
    		return minn;
    	int flow=0,f;
    	for(int i=head[start];~i;i=E[i].nxt)
    	{
    		if(dis[start]+1==dis[E[i].v]&&E[i].cap-E[i].flow>0)
    		{
    			f=dfs(E[i].v,min(minn,E[i].cap-E[i].flow));
    			E[i].flow+=f;
    			E[i^1].flow-=f;
    			flow+=f;
    			minn-=f;
    			if(minn<=0)
    				break;
    		}
    	}
    	return flow;
    }
    
    inline void Dinic(int S,int T)
    {
    	int ansflow=0;
    	while(bfs(S,T))
    		ansflow+=dfs(S,maxn);
    	printf("%d",ansflow);
    }
    
    int main()
    {
    	m=read(),n=read();
    	S=1;T=n;
    	for(int i=1;i<=n;i++)
    		head[i]=-1;
    	for(int i=1;i<=m;i++)
    	{
    		int u=read(),v=read(),w=read();
    		add(u,v,w);
    		add(v,u,0);
    	}
    	Dinic(S,T);
    	return 0;
    }
    

      

      

  • 相关阅读:
    修改ASP.NET MVC Ajax分页组件ASP.NET MvcPager一个小Bug并修该样式为自己所用(一)
    HighCharts报表 API
    自动化开发资料
    修改ASP.NET MVC Ajax分页组件ASP.NET MvcPager一个小Bug并修该样式为自己所用(三)
    网络营销资料收集
    C#扩展方法
    UI Automation Under the Hood (1)
    C#辅助类之ConfigHelper
    设计模式资源汇总
    Windows GUI自动化测试
  • 原文地址:https://www.cnblogs.com/lyqlyq/p/7196619.html
Copyright © 2020-2023  润新知