您的位置:首页 > 其它

【Codevs1993】草地排水(最大流,Dinic)

2016-12-01 16:03 253 查看

题意:在农夫约翰的农场上,每逢下雨,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.

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: