Cod sursa(job #274751)

Utilizator luigiPacala luigi Data 9 martie 2009 22:48:06
Problema Flux maxim de cost minim Scor 0
Compilator fpc Status done
Runda Arhiva educationala Marime 1.4 kb
var f:text;
    a,b:array[1..350,1..350] of longint;
    n,m,i,q1,d,q,z,k,r,j,min,fluxmax,costmin,min1,s,finish:longint;
    c,pre,v:array[1..12500] of integer;
    ver:array[1..12500] of boolean;
function lala:boolean;
begin
fillchar(ver,sizeof(ver),false);
ver[s]:=true;
c[1]:=s;
pre[s]:=0;
z:=1;
k:=1;
while z<=k do
 begin
  for i:=1 to n do
   begin
    if (a[c[z],i]>0) and (ver[i]=false) then
     begin
      pre[i]:=c[z];
      inc(k);
      c[k]:=i;
      ver[i]:=true;
     end;
   end;
  inc(z);
 end;
if ver[finish]=true then
 lala:=true
  else
 lala:=false;
end;
begin
assign(f,'fmcm.in');
reset(f);
readln(f,n,m,s,finish);
for i:=1 to m do
 begin
  read(f,q1,d,q);
  a[q1,d]:=q;
  readln(f,b[q1,d]);
 end;
close(f);
while lala do
 begin
  r:=n;
  j:=0;
  while r<>0 do
   begin
    inc(j);
    v[j]:=r;
    r:=pre[r];
   end;
  min:=maxlongint;
  min1:=maxlongint;
  for i:=j downto 2 do
   if b[v[i],v[i-1]]<min1 then
   begin
    min1:=b[v[i],v[i-1]];
    min:=a[v[i],v[i-1]];
   end
     else
    if b[v[i],v[i-1]]=min1 then
     if a[v[i],v[i-1]]<min then
      min:=a[v[i],v[i-1]];

  for i:=j downto 2 do
   begin
    a[v[i],v[i-1]]:=a[v[i],v[i-1]]-min;
    a[v[i-1],v[i]]:=a[v[i-1],v[i]]+min;
   end;
  fluxmax:=fluxmax+min;
  costmin:=costmin+min1;
 end;
assign(f,'fmcm.out');
rewrite(f);
write(f,costmin);
close(f);
end.