Pagini recente » Cod sursa (job #2348414) | Cod sursa (job #412829) | Arhiva de probleme | Cod sursa (job #2940331) | Cod sursa (job #1199146)
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.