I and OI
Past...
type  node=record
      v,n,f:longint;
end;
const maxn=410;
      oo=1<<30;
var   e:array[0..maxn] of node;
      vg,g,h:array[0..maxn] of longint;
      flow,aug,find,s,t,a:longint;
      n,m,cnt:longint;

      procedure auge(u:longint);
      var   mg,tg,p,v:longint;
      begin
            mg:=a-1;
            tg:=aug;
            if u=t then
            begin
                  inc(flow,aug);
                  find:=1;
                  exit;
            end;

            p:=h[u];
            while p>=0 do
            begin
                  v:=e[p].v;
                  if e[p].f>0 then
                  begin
                        if g[u]=g[v]+1 then
                        begin
                              if aug>e[p].f then aug:=e[p].f;
                              auge(v);
                              if g[s]>=a then exit;
                              if find=1 then break;
                              aug:=tg;
                        end;
                        if mg>g[v] then mg:=g[v];
                  end;
                  p:=e[p].n;
            end;

            if find=0 then
            begin
                  dec(vg[g[u]]);
                  if vg[g[u]]=0 then g[s]:=n;
                  g[u]:=mg+1;
                  inc(vg[g[u]]);
            end
            else
            begin
                  dec(e[p].f,aug);
                  inc(e[p xor 1].f,aug);
            end;
      end;

      procedure add(u,v,c:longint);
      begin
            e[cnt].v:=v;
            e[cnt].f:=c;
            e[cnt].n:=h[u];
            h[u]:=cnt;
            inc(cnt);
            e[cnt].v:=u;
            e[cnt].f:=0;
            e[cnt].n:=h[v];
            h[v]:=cnt;
            inc(cnt);
      end;

      procedure init;
      var   o,a,b,c:longint;
      begin
            fillchar(h,sizeof(h),255);
            cnt:=0;

            readln(m,n);
            for o:=1 to m do
            begin
                  readln(a,b,c);
                  add(a,b,c);
            end;
      end;

      procedure maxflow;
      begin
            fillchar(vg,sizeof(vg),0);
            fillchar(g,sizeof(g),0);
            s:=1;
            t:=n;
            a:=n;
            flow:=0;
            while g[s]<a do
            begin
                  aug:=oo;
                  find:=0;
                  auge(s);
            end;
            writeln(flow);
      end;

begin
      assign(input,'a.in'); reset(input);
      assign(output,'a.out'); rewrite(output);

      init;
      maxflow;

      close(input);
      close(output);
end.

  

posted on 2011-11-09 19:01  exponent  阅读(354)  评论(0编辑  收藏  举报