Cod sursa(job #303715)

Utilizator 05_YohnE1 La5c01 05_Yohn Data 10 aprilie 2009 11:31:18
Problema Flux maxim Scor 100
Compilator fpc Status done
Runda Arhiva educationala Marime 1.63 kb
var v:array[1..1000,1..1000]of longint;
    tata:array[1..1001]of integer;
    f:text;
    nod,i,s,d,n,m:integer;
    c,min,flux_max:longint;
    ok:boolean;

procedure citire;
begin
assign(f,'maxflow.in');reset(f);
read(f,n,m);
for i:=1 to m do begin
    read(f,s,d,c);
    v[s,d]:=c;
end;
close(f);
end;

procedure parcurgere;    {in latime}
var viz:array[1..1001]of boolean;
    c:array[1..1001]of integer;
    p,u:integer;
begin
fillchar(viz,sizeof(viz),false);
p:=1; u:=1; c[p]:=1;
while p<=u do begin
      nod:=c[p];
      for i:=1 to n do
      if (not viz[i]) and (v[nod,i]>0) then
         begin
         viz[i]:=true;
         inc(u);
         c[u]:=i;
         tata[i]:=nod;
         end;
      inc(p);
      end;

if viz[d] then ok:=true
          else ok:=false;
end;

procedure prg;
begin
parcurgere;
while ok do begin
      for i:=1 to n do
      if v[i,n]>0 then begin
          min:=v[i,n];
          nod:=i;
          while nod<>s do begin
                if min>v[tata[nod],nod] then min:=v[tata[nod],nod];
                nod:=tata[nod];
          end;
          nod:=i;
          while nod<>s do begin
                v[tata[nod],nod]:=v[tata[nod],nod]-min;
                v[nod,tata[nod]]:=v[nod,tata[nod]]+min;
                nod:=tata[nod];
          end;
          v[i,n]:=v[i,n]-min;
          v[n,i]:=v[n,i]+min;
          flux_max:=flux_max+min;
      end;
      parcurgere;
      end;
end;

procedure afisare;
begin
assign(f,'maxflow.out');rewrite(f);
write(f,flux_max);
close(f);
end;

begin
citire;
s:=1;  d:=n;    {s=sursa, d=dest}
prg;
afisare;
end.