Cod sursa(job #403709)

Utilizator nickyyLal Daniel Emanuel nickyy Data 25 februarie 2010 10:52:35
Problema Flux maxim Scor 60
Compilator fpc Status done
Runda Arhiva educationala Marime 1.58 kb
const infile='maxflow.in';
  outfile='maxflow.out';
  maxn=1001;
  maxm=5001;
  sursa=1;
  infinit=maxlongint;
var a:array[1..maxn,0..maxn]of longint;
  c,f:array[1..maxn,1..maxn]of longint;
  tata,q,cf:array[1..maxn]of longint;
  n,m,destin:longint;
  fmax:longint;

 procedure citire;
 var i,j,k:longint;
 begin
   assign(input,infile); reset(input); readln(n,m);
   while(m>0)do begin
    readln(i,j,k); dec(m); c[i,j]:=k;
    inc(a[i,0]); a[i,a[i,0]]:=j;
    end;
   close(input);
 end;

 function minim(x,y:longint):longint;
 begin
   if(x<y)then minim:=x
   else minim:=y;
 end;

 function bf:longint;
 var ic,sf,i,x:longint;
 begin
   for i:=2 to n do begin cf[i]:=0; tata[i]:=0; end;
   tata[1]:=-1; cf[sursa]:=infinit;
   ic:=1; sf:=1; q[sf]:=sursa;
   while(ic<=sf)and(cf[destin]=0)do begin
     x:=q[ic];
     for i:=1 to a[x,0]do
       if(c[x,a[x,i]]-f[x,a[x,i]]>0)and(tata[a[x,i]]=0)then begin
         tata[a[x,i]]:=x;
         cf[a[x,i]]:=minim(cf[x],c[x,a[x,i]]-f[x,a[x,i]]);
         inc(sf); q[sf]:=a[x,i];
         end;
     inc(ic);
     end;
   bf:=cf[destin];
 end;

 procedure solve;
 var v,min:longint;
 begin
  fmax:=0; destin:=n;
  repeat
    min:=bf;
    if(min=0)then
    else begin
      inc(fmax,min);
      v:=destin;
      while(v<>sursa)do begin
        inc(f[tata[v],v],min); dec(f[v,tata[v]],min);
        v:=tata[v];
        end;
      end;
  until min=0;
 end;

 procedure scrie;
 begin
   assign(output,outfile); rewrite(output); write(fmax);
   close(output);
 end;

begin
citire; solve; scrie;
end.