Cod sursa(job #301031)

Utilizator SprzlAbcdefg Sprzl Data 7 aprilie 2009 21:03:18
Problema Flux maxim Scor 20
Compilator fpc Status done
Runda Arhiva educationala Marime 1.86 kb
program flux;
type lista = ^articol;
     articol = record
                 nr:longint;
                 u,b:lista;
                 c:longint;
               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;
    viz:array [1..1000] of boolean;
procedure df(nod:longint);
var i:longint;
begin
  viz[nod]:=true;
  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 not viz[a[nod]^.nr] then
      if a[nod]^.c> 0 then
      begin
        if a[nod]^.c<min then
          min:=a[nod]^.c;
        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:=c;

    a[y]^.nr:=x;
    inc(g[y]);
    a[y]^.c:=0;
    a[x]^.b:=a[y];
    a[y]^.b:=a[x];

    new(a[x]^.u);
    new(a[y]^.u);
    if x<>y then
    a[y]:=a[y]^.u;
    a[x]:=a[x]^.u;
    inc(g[x]);
  end;

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

  fl:=0;

  min:=maxlongint;
  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
      begin
        dec(d[i]^.c,min);
        inc(d[i]^.b^.c,min)
      end;
      min:=maxint;
      szd:=0;
      fillchar(viz,sizeof(viz),false);
    end;
  end;

  writeln(fl);

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