【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.
null