Cod sursa(job #300808)

Utilizator SprzlAbcdefg Sprzl Data 7 aprilie 2009 18:21:56
Problema Flux maxim Scor 20
Compilator fpc Status done
Runda Arhiva educationala Marime 1.81 kb
program flux;
type capacitate = record
                    max,can:word;
                  end;
     lista = ^articol;
     articol = record
                 nr:word;
                 u:lista;
                 c:capacitate;
               end;
var d,a,p:array [1..1000] of lista;
    parinte,cap,g:array [0..1000] of word;
    fl,min,szd,aux,sursa,destinatie,i,j,n,m,x,y,c:word;
    saturat:array [1..1000] of boolean;
    done:boolean;

procedure df(nod:word);
var i:word;
begin
  if nod = destinatie then
  begin
    done:=true;
  end;

  for i:=1 to g[nod] do
  begin
     if done then
     begin
       a[nod]:=p[nod];
       exit;
     end;
    if a[nod]^.c.max-a[nod]^.c.can > 0 then
    begin
      if a[nod]^.c.max-a[nod]^.c.can<min then
        min:=a[nod]^.c.max-a[nod]^.c.can;
      inc(szd);
      d[szd]:=a[nod];
      df(a[nod]^.nr);
    end;
    a[nod]:=a[nod]^.u;
  end;
  a[nod]:=p[nod];
end;


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

  readln(n,m);
  fillchar(g,sizeof(g),0);
  sursa:=1;
  destinatie:=n;

  for i:=1 to n do
  begin
    new(a[i]);
    p[i]:=a[i];
  end;

  for i:=1 to m do
  begin
    readln(x,y,c);
    a[x]^.nr:=y;
    a[x]^.c.max:=c;
    a[x]^.c.can:=0;
    new(a[x]^.u);
    a[x]:=a[x]^.u;
    inc(g[x]);
  end;

  for i:=1 to n do
    a[i]:=p[i];

  fl:=0;

  parinte[sursa]:=0;
  fillchar(saturat,sizeof(saturat),false);
  cap[sursa]:=maxint;
  min:=maxint;
  szd:=0;
  done:=true;

  while done do
  begin
    done:=false;
    df(sursa);
    if done then
    begin
      inc(fl,min);
      for i:=1 to szd do
        inc(d[i]^.c.can,min);
      min:=maxint;
      szd:=0;
    end;
  end;

  writeln(fl);

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