Cod sursa(job #300814)

Utilizator SprzlAbcdefg Sprzl Data 7 aprilie 2009 18:25:02
Problema Flux maxim Scor 20
Compilator fpc Status done
Runda Arhiva educationala Marime 1.68 kb
program flux;
type capacitate = record
                    max,can:longint;
                  end;
     lista = ^articol;
     articol = record
                 nr:longint;
                 u:lista;
                 c:capacitate;
               end;
var d,a,p:array [1..1000] of lista;
    g:array [0..1000] of longint;
    fl,min,szd,sursa,destinatie,i,n,m,x,y,c:longint;
    done:boolean;
procedure df(nod:longint);
var i:longint;
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;

  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.