Cod sursa(job #300671)

Utilizator SprzlAbcdefg Sprzl Data 7 aprilie 2009 16:37:35
Problema Flux maxim Scor 0
Compilator fpc Status done
Runda Arhiva educationala Marime 1.52 kb
program flux;
type capacitate = record
                    max,can:integer;
                  end;
     lista = ^articol;
     articol = record
                 nr:integer;
                 u:lista;
                 c:capacitate;
               end;
var a,p:array [1..100] of lista;
    parinte,cap,g:array [0..100] of integer;
    aux,sursa,destinatie,i,j,n,m,x,y,c:integer;
    saturat:array [1..100] of boolean;

function min(x,y:integer):integer;
begin
  min:=x;
  if y<x then
    min:=y;
end;


procedure df(nod,tata:integer);
var i:integer;
begin
  for i:=1 to g[nod] do
  begin
    if a[nod]^.c.can<>a[nod]^.c.max then
    begin
      aux:=min(cap[nod],a[nod]^.c.max-a[nod]^.c.can);
      inc(a[nod]^.c.can,aux);
      inc(cap[a[nod]^.nr],aux);
      dec(cap[nod],aux);
      df(a[nod]^.nr,nod);
    end;
    a[nod]:=a[nod]^.u;
  end;
  a[nod]:=p[nod];
end;


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

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

  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];

  parinte[sursa]:=-1;
  fillchar(saturat,sizeof(saturat),false);
  cap[sursa]:=maxint;
  df(sursa,-1);

  writeln(cap[destinatie]);
  close(input);
  close(output);
end.