zoukankan      html  css  js  c++  java
  • 【Codevs1993】草地排水(最大流,Dinic)

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

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

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

     (0 <= N <= 200) 和 M (2 <= M <= 200)

    Si 和 Ei (1 <= Si, Ei <= M) 指明排水沟两端的交点,雨水从Si 流向Ei。Ci (0 <= Ci <= 10,000,000)是这条排水沟的最大容量。

    思路:最大流,Dinic模板。

     1 var head,vet,next,len,gap,dis,fan:array[0..10000]of longint;
     2     n,m,i,x,y,z,tot,src,source:longint;
     3 
     4 procedure add(a,b,c:longint);
     5 begin
     6  inc(tot);
     7  next[tot]:=head[a];
     8  vet[tot]:=b;
     9  len[tot]:=c;
    10  head[a]:=tot;
    11 end;
    12 
    13 function min(x,y:longint):longint;
    14 begin
    15  if x<y then exit(x);
    16  exit(y);
    17 end;
    18 
    19 function dfs(u,aug:longint):longint;
    20 var e,v,t,val,flow:longint;
    21 begin
    22  if u=src then exit(aug);
    23  flow:=0; val:=n-1;
    24  e:=head[u];
    25  while e<>0 do
    26  begin
    27   v:=vet[e];
    28   if len[e]>0 then
    29   begin
    30    if dis[u]=dis[v]+1 then
    31    begin
    32     t:=dfs(v,min(len[e],aug-flow));
    33     len[e]:=len[e]-t;
    34     len[fan[e]]:=len[fan[e]]+t;
    35     flow:=flow+t;
    36     if dis[source]>=n then exit(flow);
    37     if aug=flow then break;
    38    end;
    39    val:=min(val,dis[v]);
    40   end;
    41   e:=next[e];
    42  end;
    43  if flow=0 then
    44  begin
    45   dec(gap[dis[u]]);
    46   if gap[dis[u]]=0 then dis[source]:=n;
    47   dis[u]:=val+1;
    48   inc(gap[dis[u]]);
    49  end;
    50  exit(flow);
    51 end;
    52 
    53 function maxflow:longint;
    54 var ans:longint;
    55 begin
    56  fillchar(dis,sizeof(dis),0);
    57  fillchar(gap,sizeof(gap),0);
    58  gap[0]:=n; ans:=0;
    59  while dis[source]<n do ans:=ans+dfs(source,maxlongint);
    60  exit(ans);
    61 end;
    62 
    63 begin
    64 
    65  readln(m,n);
    66  for i:=1 to m do
    67  begin
    68   readln(x,y,z);
    69   fan[tot+1]:=tot+2;
    70   fan[tot+2]:=tot+1;
    71   add(x,y,z);
    72   add(y,x,0);
    73  end;
    74  source:=1; src:=n;
    75  writeln(maxflow);
    76 
    77 end.
  • 相关阅读:
    调整数组顺序使奇数位于偶数前面
    网站远程附件存储到 OSS
    平滑升级mariadb
    在Apache服务器上安装SSL证书
    复试-英语
    部署博客(docker)
    远程连接Windows
    Ultimate SLAM?利用事件相机解锁高速运动、高动态范围场景
    LRNNet:轻量级FCB& SVN实时语义分割
    3D目标检测深度学习方法中voxel-represetnation内容综述(三)
  • 原文地址:https://www.cnblogs.com/myx12345/p/6122347.html
Copyright © 2011-2022 走看看