Cod sursa(job #928978)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 26 martie 2013 19:43:16
Problema Flux maxim Scor 70
Compilator fpc Status done
Runda Arhiva educationala Marime 1.49 kb
program fluxxx;
type vect=array[1..100000] of longint;
     vectbool=array[1..100000] of boolean;
     mat=array[1..10000,1..10000] of longint;
var v:mat; tata:vect; ok:boolean;
    nod,i,s,d,n,m,c,min,flux:longint;
    f,g:text;
    intrare:array[1..300000]of char;
procedure parcurgere;
var viz:vectbool; coada:vect;
    p,u:integer;
begin
fillchar(viz,sizeof(viz),false);
p:=1; u:=1;
coada[p]:=1;
while p<=u do
 begin
 nod:=coada[p];
 for i:=1 to n do
   if (not viz[i]) and (v[nod,i]>0) then
      begin
      viz[i]:=true;
      inc(u);
      coada[u]:=i;
      tata[i]:=nod;
      end;
 inc(p);
 end;
if viz[d] then ok:=true
          else ok:=false;
end;

procedure bagafluxu;
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;
     flux:=flux+min;
     end;
 parcurgere;
 end;
end;

begin
assign(f,'maxflow.in'); reset(f);   settextbuf(f,intrare);
assign(g,'maxflow.out'); rewrite(g);
readln(f,n,m);
for i:= 1 to m do
  begin
  readln(f,s,d,c);
  v[s,d]:=c;
  end;
flux:=0;
s:=1; d:=n;
bagafluxu;
writeln(g,flux);
close(f); close(g);
end.