zoukankan      html  css  js  c++  java
  • 洛谷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

    裸的最大流

    dinic:

    program rrr(input,output);
    const
      inf=123456789;
    type
      pointer=^nodetype;
      nodetype=record
         t,c:longint;
         next,rev:pointer;
      end;
    var
      a,cur:array[0..220]of pointer;
      q,d:array[0..220]of longint;
      p:pointer;
      n,m,i,x,y,c,ans,h,t:longint;
    procedure ins(x,y,c:longint);
    begin
       new(p);p^.t:=y;p^.c:=c;p^.next:=a[x];a[x]:=p;
    end;
    procedure add(x,y,c:longint);
    begin
       ins(x,y,c);ins(y,x,0);
       a[x]^.rev:=a[y];a[y]^.rev:=a[x];
    end;
    function min(a,b:longint):longint;
    begin
       if a<b then exit(a) else exit(b);
    end;
    procedure bfs;
    begin
       for i:=2 to n do d[i]:=-1;
       h:=0;t:=1;q[1]:=1;d[1]:=0;
       while h<t do
          begin
             inc(h);
             p:=a[q[h]];
             while p<>nil do
                begin
                   if (d[p^.t]=-1) and (p^.c>0) then
                      begin
                         d[p^.t]:=d[q[h]]+1;
                         inc(t);q[t]:=p^.t;
                      end;
                   p:=p^.next;
                end;
          end;
    end;
    function dfs(k,f:longint):longint;
    var
      ans,r:longint;
      p:pointer;
    begin
       if (k=n) or (f=0) then exit(f);
       ans:=0;
       p:=cur[k];
       while p<>nil do
          begin
             if (d[p^.t]=d[k]+1) and (p^.c>0) then
                begin
                   r:=dfs(p^.t,min(f,p^.c));
                   p^.c:=p^.c-r;
                   p^.rev^.c:=p^.rev^.c+r;
                   ans:=ans+r;
                   f:=f-r;
                   if f=0 then break;
                end;
             p:=p^.next;
             cur[k]:=p;
          end;
       if f>0 then d[k]:=-1;
       exit(ans);
    end;
    begin
       //assign(input,'r.in');assign(output,'r.out');reset(input);rewrite(output);
       readln(m,n);
       for i:=1 to n do a[i]:=nil;
       for i:=1 to m do begin read(x,y,c);add(x,y,c); end;
       ans:=0;
       while true do
          begin
             bfs;
             if d[n]=-1 then break;
             for i:=1 to n do cur[i]:=a[i];
             ans:=ans+dfs(1,inf);
          end;
       write(ans);
       //close(input);close(output);
    end.
  • 相关阅读:
    HDU 2433 Travel (最短路,BFS,变形)
    HDU 2544 最短路 (最短路,spfa)
    HDU 2063 过山车 (最大匹配,匈牙利算法)
    HDU 1150 Machine Schedule (最小覆盖,匈牙利算法)
    290 Word Pattern 单词模式
    289 Game of Life 生命的游戏
    287 Find the Duplicate Number 寻找重复数
    283 Move Zeroes 移动零
    282 Expression Add Operators 给表达式添加运算符
    279 Perfect Squares 完美平方数
  • 原文地址:https://www.cnblogs.com/Currier/p/6435758.html
Copyright © 2011-2022 走看看