• POJ 1273 -Drainage Ditches


     Time Limit:1000MS    Memory Limit:10000K

    Description

          Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This means that the clover is covered by water for awhile and takes quite a long time to regrow. Thus, Farmer John has built a set of drainage ditches so that Bessie's clover patch is never covered in water. Instead, the water is drained to a nearby stream. Being an ace engineer, Farmer John has also installed regulators at the beginning of each ditch, so he can control at what rate water flows into that ditch. 
          Farmer John knows not only how many gallons of water each ditch can transport per minute but also the exact layout of the ditches, which feed out of the pond and into each other and stream in a potentially complex network. 
          Given all this information, determine the maximum rate at which water can be transported out of the pond and into the stream. For any given ditch, water flows in only one direction, but there might be a way that water can flow in a circle. 

         每次下雨的时候,农场主John的农场里就会形成一个池塘,这样就会淹没其中一小块土地,在这块土地上种植了Bessie最喜欢的苜蓿。这意味着苜蓿要被水淹没一段时间,而后要花很长时间才能重新长出来。因此,John修建了一套排水系统,这样种植了苜蓿的土地就不会被淹没。雨水被排到了附近的一条小河中。作为一个一流的工程师,John还在每条排水沟的起点安装了调节阀门,这样可以控制流入排水沟的水流的速度。

        John不仅知道每条排水沟每分钟能排多少加仑的水,而且还知道整个排水系统的布局,池塘里的水通过这个排水系统排到排水沟,并最终排到小何中,构成一个复杂的排水网络。

        给定排水系统,计算池塘能通过这个排水系统排水到小河中的最大水流速度。每条排水沟的流水方向是单方向的,但在排水系统中,流水可能构成循环。

    Input

        The input includes several cases. For each case, the first line contains two space-separated integers, N (0 <= N <= 200) and M (2 <= M <= 200). N is the number of ditches that Farmer John has dug. M is the number of intersections points for those ditches. Intersection 1 is the pond. Intersection point M is the stream. Each of the following N lines contains three integers, Si, Ei, and Ci. Si and Ei (1 <= Si, Ei <= M) designate the intersections between which this ditch flows. Water will flow through this ditch from Si to Ei. Ci (0 <= Ci <= 10,000,000) is the maximum rate at which water will flow through the ditch.

         输入文件中包含多个测试数据。每个测试数据的第1行为两个整数M和N,用空格隔开。0≤M≤200,2≤N≤200,其中M是排水沟的数目,N是这些排水沟形成的汇合结点数目。结点1为池塘,结点N为小河。接下来有M行,每行描述了一条排水沟,用三个整数来描述:Si,Ei和Ci,其中Si和Ei(1≤Si,Ei≤N)标明了这条排水沟的起点和终点,水流从Si流向Ei,Ci(0≤Ci≤10 000 000)表示通过这条排水沟的最大流水速度。

    Output

          For each case, output a single integer, the maximum rate at which water may emptied from the pond.

       对于输入文件中的每个测试数据,输出一行,为一个整数,表示整个排水系统可以从池塘排出水的最大速度。

     

    Sample Input

     

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

     

    Sample Output

     

    50

     

    Source

     

       USACO 93
     
       
        然而这道题目就是赤裸裸的求容量网络中的最大流...

        代码:

     1 var
     2   c,e,n,m,i,s,t:longint;
     3   ans,inf:int64;
     4   h,d,f,g:array[0..5000]of longint;
     5   ot,cap,ne:array[0..100000]of longint;
     6 
     7 procedure addedge(x,y,z:longint);
     8 begin
     9   ot[e]:=y; ne[e]:=g[x]; cap[e]:=z; g[x]:=e; inc(e);
    10   ot[e]:=x; ne[e]:=g[y]; cap[e]:=0; g[y]:=e; inc(e);
    11 end;
    12 
    13 function min(a,b:int64):int64;
    14 begin
    15   if a<b then exit(a)
    16          else exit(b);
    17 end;
    18 
    19 function bfs:boolean;
    20 var
    21   l,r,x,p:int64;
    22 begin
    23   for i:=1 to n do d[i]:=n+10;
    24   l:=0; r:=1; h[1]:=s; d[s]:=0;
    25   while l<r do
    26     begin
    27       inc(l);
    28       p:=g[h[l]];
    29       while p<>-1 do
    30         begin
    31           if (cap[p]<>0)and(d[ot[p]]>d[h[l]]+1) then
    32             begin
    33               inc(r);
    34               h[r]:=ot[p];
    35               d[ot[p]]:=d[h[l]]+1;
    36             end;
    37           p:=ne[p];
    38         end;
    39     end;
    40   exit(d[t]<>n+10);
    41 end;
    42 
    43 function dfs(x,flow:int64):int64;
    44 var
    45   p,tmp:int64;
    46 begin
    47   if x=t then exit(flow);
    48   p:=f[x]; dfs:=0;
    49   while (p<>-1)and(dfs<flow) do
    50     begin
    51       if (cap[p]<>0)and(d[ot[p]]=d[x]+1) then
    52         begin
    53           tmp:=dfs(ot[p],min(flow-dfs,cap[p]));
    54           dec(cap[p],tmp);
    55           inc(cap[p xor 1],tmp);
    56           inc(dfs,tmp);
    57         end;
    58       p:=ne[p];
    59     end;
    60   f[x]:=p;
    61 end;
    62 
    63 begin
    64   inf:=high(int64);
    65   while not eof do begin
    66   readln(m,n);
    67   e:=0;
    68   fillchar(g,sizeof(g),255);
    69   for i:=1 to m do
    70     begin
    71       readln(s,t,c);
    72       addedge(s,t,c);
    73     end;
    74   s:=1; t:=n; ans:=0;
    75   while bfs do
    76     begin
    77       for i:=1 to n do
    78         f[i]:=g[i];
    79       inc(ans,dfs(s,inf));
    80     end;
    81   writeln(ans); end;
    82 end.

     

  • 相关阅读:
    004 连接查询
    003 常用函数说明
    003 限定查询
    002 基础查询
    001 基础数据表脚本
    001 redis的简介和重点
    006 表单组件
    005 基本表单
    004 表格元素
    谚语,
  • 原文地址:https://www.cnblogs.com/kry-ssw-1314/p/4559239.html
Copyright © 2020-2023  润新知