zoukankan      html  css  js  c++  java
  • 【9018:1555】草地排水

    1555: Drainage Ditches(草地排水)

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 122  解决: 80
    [提交][状态][讨论版]

    题目描述

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

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

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

    输入

    1: 两个用空格分开的整数N (0 <= N <= 200) M (2 <= M <= 200)N是农夫约翰已经挖好的排水沟的数量,M是排水沟交叉点的数量。交点1是水潭,交点M是小溪。
    第二行到第N+1: 每行有三个整数,Si, Ei, CiSi Ei (1 <= Si, Ei <= M) 指明排水沟两端的交点,雨水从Si 流向EiCi (0 <= Ci <= 10,000,000)是这条排水沟的最大容量。

    输出

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

    样例输入

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

    样例输出

    50

    题解:网络流模板题。
    代码如下:
     1 #include<cstdio>  
     2 #include<iostream> 
     3 #include<cstring>
     4 #include<queue>
     5 #define Max 210
     6 #define INF 0x7fffffff    
     7 using namespace std; 
     8 struct edge{int to,cap,next,rev;}e[Max*2]; 
     9 int s,t,n,m,cnt=0,head[Max],lev[Max],q[Max]; 
    10 void ins(int u,int v,int w){ 
    11     e[++cnt].to=v;e[cnt].next=head[u];head[u]=cnt;e[cnt].cap=w;e[cnt].rev=cnt+1;  
    12     e[++cnt].to=u;e[cnt].next=head[v];head[v]=cnt;e[cnt].cap=0;e[cnt].rev=cnt-1;
    13 } 
    14 bool bfs(){ 
    15     memset(lev,-1,sizeof(lev)); 
    16     int hd=0,tl=1;
    17     lev[s]=0; q[hd]=s; 
    18     while(hd<tl){ 
    19         int v=q[hd++];
    20         for(int i=head[v];i;i=e[i].next)
    21             if(e[i].cap>0&&lev[e[i].to]<0){ 
    22                 lev[e[i].to]=lev[v]+1;
    23                 q[tl++]=e[i].to;
    24             }
    25     }
    26     if(lev[t]==-1) return false;
    27     return true;
    28 } 
    29 int dfs(int u,int f){ 
    30     int used=0; 
    31     if(u==t) return f; 
    32     for(int i=head[u];i;i=e[i].next) { 
    33         if (e[i].cap>0&&lev[u]<lev[e[i].to]){ 
    34             int w=dfs(e[i].to,min(f-used,e[i].cap)); 
    35             if (w>0){ 
    36                 e[i].cap-=w; e[e[i].rev].cap+=w; used+=w; 
    37                 if(used==f) break; 
    38             } 
    39         } 
    40     }
    41     if(!used) lev[u]=-1;
    42     return used; 
    43 } 
    44 int dinic(){ 
    45     int flow=0;
    46     while(bfs()) flow+=dfs(s,INF);
    47     return flow;
    48 }  
    49 int main () 
    50 { 
    51     scanf("%d%d",&n,&m); s=1; t=m; 
    52     for (int i=1;i<=n;i++){ 
    53         int x,y,z;
    54         scanf("%d%d%d",&x,&y,&z); 
    55         ins(x,y,z); 
    56     } 
    57     printf("%d",dinic());
    58     return 0;
    59 }
     
  • 相关阅读:
    HDU-4027-Can you answer these queries?
    Python的多协程(三种简单生成多协程方法)
    关于django 如何实现简单api的restful 接口
    flask 框架服务原理
    DVWA渗透测试环境搭建
    装饰器 python 你也可以叫语法糖
    websocket python实现原理
    robotframe 自定义开发库
    mysql linux 安装卸载
    python+jenkins 构建节点环境编译器配置问题
  • 原文地址:https://www.cnblogs.com/Beginner-/p/7248412.html
Copyright © 2011-2022 走看看