【codevs1993】草地排水(最大流)

  最近学了最大流,于是去codevs找了几道最大流裸题(这是我第一次写网络流)。

  题目大意:求一个图的最大流(就是这样的裸题)

  第一次A网络流的题,发个博客纪念一下。

var n,m,i,j,k,h,t,x,y,z,ans:longint;
  a:array[0..410,0..410]of longint;
  q,l:array[0..510]of longint;
function dfs(now,p:longint):longint;
var i,ll:longint;
begin
  if now=n then exit(p);
  for i:=1 to n do
    if(l[now]+1=l[i])and(a[now,i]>0)then begin
      if a[now,i]>p then ll:=dfs(i,p)
      else ll:=dfs(i,a[now,i]);
      a[now,i]:=a[now,i]-ll; a[i,now]:=a[i,now]+ll;
      if ll>0 then exit(ll);
    end;
  exit(0);
end;
begin
  read(m,n);
  for i:=1 to m do begin
    read(x,y,z);
    a[x,y]:=a[x,y]+z;
  end;
  ans:=0;
  while true do begin
    for i:=1 to n do
      l[i]:=0;
    h:=1; t:=1; q[1]:=1; l[1]:=1;
    repeat
      for i:=1 to n do
        if(l[i]=0)and(a[q[h],i]>0)then begin
          inc(t); q[t]:=i; l[i]:=l[q[h]]+1;
        end;
      inc(h);
    until h>t;
    if l[n]=0 then break;
    repeat
      k:=dfs(1,maxint);
      ans:=ans+k;
    until k=0;
  end;
  writeln(ans);
end.
View Code

 

posted @ 2017-01-13 08:44  QuartZ_Z  阅读(185)  评论(0编辑  收藏  举报