Cod sursa(job #1199146)

Utilizator vasica38Vasile Catana vasica38 Data 18 iunie 2014 12:28:20
Problema Flux maxim Scor 0
Compilator fpc Status done
Runda Arhiva educationala Marime 2.22 kb
program fluxmaxim;
type lista=^celula;
celula= record
    info:longint;
    next:lista;
       end;
var f,g:text;
   graf:array[0..1001] of lista;
   coada:array[0..1000] of longint;
   i,j,k,n,m,u,x,y,c,flow:longint;
   viz:array[0..1000] of 0..1;
   tata:array[0..1000] of longint;
   cosT:array[0..1001,0..1001] of longint;
   ok:boolean;

procedure add ( x:longint ; var p:lista);
var r:lista;
begin
 new(R);
 r^.info:=x;
 r^.next:=p;
 p:=r;
end;






procedure update ();
var nod,min:longint;
begin
  nod:=n;
  min:=1000000;
  while tata[nod]<>-1 do begin
        if (cost[tata[nod],nod]<min) then min:=cost[tata[nod],nod];
        nod:=tata[nod];
          end;
  nod:=n;
  flow:=flow+min;
  while tata[nod]<>-1 do begin
        cost[tata[nod],nod]:=cost[tata[nod],nod]-min;
        cost[nod,tata[nod]]:=cost[nod,tata[nod]]+min;
        nod:=tata[nod];
                end;
end;


procedure bfs();
var i_C,sf_C:longint;
    r:lista;
begin

i_C:=1;
sf_C:=1;
ok:=false;
for i:=1 to n do viz[i]:=1;
viz[1]:=1;
tata[1]:=-1;
while i_C<=sf_C do begin
            r:=graf[coada[i_C]];
              while r<> nil do begin
                   if (viz[r^.info]=0)  and (cost[coada[I_c],r^.info]>0) then begin
                                if r^.info <>n then begin
                                                inc(sf_C);
                                                coada[sf_C]:=r^.info;
                                                end;
                                tata[r^.info]:=coada[i_C];
                                viz[r^.info]:=1;
                                        end;
              if viz[n]=1 then begin
                        ok:=true;
                        update;
                        viz[n]:=0;
                             end;
               r:=r^.next;
               end;
              inc(i_C);
                end;
end;




begin
assign(f,'maxflow.in');reset(F);
assign(g,'maxflow.out');rewrite(G);
readln(F,n,m);
for i:=1 to m do begin
         readln(F,x,y,c);
         add(x,graf[y]);
         add(y,graf[x]);
         cost[x,y]:=c;
                end;

ok:=true;
while ok do bfs();
writeln(g,flow);
close(F);
close(G);
end.