Cod sursa(job #1217055)

Utilizator RusuAlexeiRusu Alexei RusuAlexei Data 6 august 2014 15:51:41
Problema Flux maxim Scor 40
Compilator fpc Status done
Runda Arhiva educationala Marime 1.99 kb
program flux;
  type lista= ^celula;
       celula=record
                info:longint;
                next:lista;
              end;
  var n,m,i,x,y,z,min,f:longint;
      a:array [1..1000] of lista;
      r,coada,v,q:lista;
      c:array[1..1000,1..1000] of longint;
      from:array[1..1000]of longint;
      vis:array[1..1000] of byte;
      ok:boolean;

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

  readln(n,m);
  for i:=1 to m do
    begin
      readln(x,y,z);
      new(r);
      r^.info:=y;
      r^.next:=a[x];
      a[x]:=r;
      c[x,y]:=z;
    end;
ok:=true;
while ok do
 begin
  ok:=false;
  for i:=1 to n do begin vis[i]:=0;from[i]:=0; end;

  new(coada); vis[1]:=1;
  coada^.info:=1;v:=coada;
  while coada<>nil do
    begin

      q:=a[coada^.info];
      while q<>nil do
        begin
          if c[coada^.info,q^.info]>0 then
          if vis[q^.info]=0 then
            begin
              from[q^.info]:=coada^.info;
              if q^.info=n then
                begin
                  ok:=true;
                  x:=n; min:=1000000000;
                  while from[x]<>0 do
                    begin
                      if c[from[x],x]<min then min:=c[from[x],x];
                      x:=from[x];
                    end;
                  x:=n;
                  f:=f+min;
                  while from[x]<>0 do
                    begin

                      c[from[x],x]:=c[from[x],x]-min;
                      c[x,from[x]]:=c[x,from[x]]+min;
                      x:=from[x];
                    end;
                end else
                begin
                  vis[q^.info]:=1;
                  new(r);
                   r^.info:=q^.info;
                  v^.next:=r;
                  v:=r;
                end;
            end;
          q:=q^.next;
        end;

      coada:=coada^.next;
    end;

 end;

   writeln(f);
   close(output);
end.