Dinic

const maxn=1001;

type node=^nd;
     nd=record nam,c:longint; same,next:node; end;

var i,j,k,m,n,l,s,t:longint;
    a,b,sp:array[0..maxn]of node;
    q,lv,stack:array[0..maxn]of longint;
    head,tail,max_flow,flow:longint;
    p:node;

function bfs:boolean;
begin
     fillchar(lv,sizeof(lv),$ff);
     head:=0; tail:=1; q[1]:=s; lv[s]:=0;
     while head<tail do
     begin
          inc(head);
          p:=a[q[head]];
          while p<>nil do
          begin
               if (lv[p^.nam]=-1)and(p^.c>0) then
               begin
                    inc(tail); q[tail]:=p^.nam; lv[p^.nam]:=lv[q[head]]+1;
                    if p^.nam=t then exit(true);
               end;
               p:=p^.next;
          end;
     end;
     exit(false);
end;

procedure dinic;
var i,j:longint;
begin
     b:=a; head:=1; stack[head]:=s;
     while head>0 do
     begin
          i:=stack[head];
          if i<>t then
          begin
               while b[i]<>nil do
               begin
                    if (lv[b[i]^.nam]=lv[i]+1)and(b[i]^.c>0) then break;
                    b[i]:=b[i]^.next;
               end;
               if b[i]<>nil then
               begin inc(head); stack[head]:=b[i]^.nam; sp[head]:=b[i]; end
               else begin dec(head); lv[i]:=-1; end;
          end
          else begin
                    flow:=maxlongint;
                    for i:=head downto 2 do
                      if sp[i]^.c<flow then flow:=sp[i]^.c;
                    for i:=head downto 2 do
                    begin
                         dec(sp[i]^.c,flow);
                         inc(sp[i]^.same^.c,flow);
                         if sp[i]^.c=0 then head:=i-1;
                    end;
                    inc(max_flow,flow);
               end;
     end;
end;

begin
     while bfs do dinic;
     writeln(max_flow);
end.
  1. 恩,就是加反向边

  1. 还没有引用通告。

Copyright © 2007 ihost.tw All rights reserved. Tech Support: coz.tw