Như đã trình bày ở phần trên , thuật toán Ford –Fulkerson được cài đặt bằng cách kết hợp 2 thủ tục Find-Path (thủ tục gán nhãn tìm đường tăng luồng) và Inc-Flow (thủ tục tăng luồng theo đường tăng).
procedure L_find_path(var L_G1:L_typedothi);
{
thu tuc gan nhan tim duong tang luong:
L_p[v],L_nhan,L_e[v] la nhan cua dinh v;
L_v la danh sach cac dinh co nhan nhung chua xet;
}
VAR x,y:integer;
ok:boolean;
a1,b1,k1,l1:real;
t,t1,i:integer;
BEGIN
for i:=0 to L_G1.sodinh-1 do
L_p1[i]:=-1;
L_p1[0]:=0;
L_nhan[0]:=true;
L_e[0]:=vocung;
L_v:=[0] ; L_v1:=[0];
L_pathfound:=true;
While L_v<>[] do
Begin
ok:=true;
x:=0;
While (x<=L_G1.sodinh-1) and (ok=true) do
Begin
If x in L_v then ok:=false
Else
x:=x+1;
End;
L_v:=L_v-[x];
For y:=0 to L_G1.sodinh-1 do
If L_p1[y]=-1 then
Begin
L_giatri(L_G1,x,y,t,a1,b1); {a:=c[x,y],b:=f[x,y]}
L_giatri(L_G1,y,x,t1,k1,l1); {k:=c[y,x],l:=f[y,x]}
If (a1>0) and (b1<a1) then
Begin
L_p1[y]:=x;
L_nhan[y]:=true;
L_e[y]:=L_min(L_e[x],a1-b1);
L_v:=L_v+[y];
L_v1:=L_v1+[y];
If y=L_G1.sodinh-1 then
Begin
exit;
End;
End
Else
If (k1>0) and (l1>0) then
Begin
L_p1[y]:=x;
L_nhan[y]:=false;
L_e[y]:=L_min(L_e[x],l1);
L_v:=L_v+[y];
L_v1:=L_v1+[y];
If y=L_G1.sodinh-1 then
Begin
exit;
End;
End;
End;
End;
L_pathfound:=false;
end;
procedure L_Inc_flow(var L_G1:L_typedothi);
{
tang luong theo duong tang
}
var x,y,t,t1:integer;
tang,a,k:real;
s,s1,s2,s3,s4:string;
ok:boolean;
begin
x:=L_G1.sodinh-1;
y:=L_G1.sodinh-1;
tang:=L_e[L_G1.sodinh-1];
ok:=false;
while x<>0 do
begin
y:=L_p1[x];
L_giatri(L_G1,x,y,t,a,L_b); {a:=c[x,y],b:=f[x,y]}
L_giatri(L_G1,y,x,t1,k,L_l); {k:=c[y,x],l:=f[y,x]}
if L_nhan[x] then
L_G1.dscanh[t1].trongso.gia:=L_G1.dscanh[t1].trongso.gia+tang
else
begin
L_G1.dscanh[t].trongso.gia:=L_G1.dscanh[t].trongso.gia-tang;
ok:=true;
end;
x:=y;
end;
end;
procedure L_luongcucdai(L_G:L_typedothi; var L_G1:L_typedothi;var gt:real);
{
thu tuc the hien thuat toan Ford_fulkerson
}
var x,y,z,t,i,j,t1,t2:integer;
a1,b1,f:real;
ok1,stop:boolean;
s,s1,ch,ch1,a:string;
begin
L_G1.SoDinh:=L_G.SoDinh ;
L_G1.socanh:=L_G.socanh;
setlength(L_p1,L_G1.SoDinh);
setlength(L_nhan,L_G1.SoDinh );
setlength(L_e,L_G1.SoDinh );
setlength(L_G1.DSdinh,L_G1.SoDinh );
Setlength(L_G1.dscanh,L_G1.SoCanh );
for j:=0 to L_G.SoDinh -1 do
L_G1.DSDinh[j]:=L_G.DSDinh[j];
for j:=0 to L_G.SoCanh -1 do
L_G1.DSCanh[j]:=L_G.DSCanh[j];
stop:=false;
while not stop do
begin
L_find_path(L_G1);
if L_pathfound then
begin
tam:=tam+1;
if tam>1 then
L_inc_flow(L_G1)
else
stop:=true;
end;
f:=0;
for y:= 0 to L_G1.sodinh-1 do
begin
L_giatri(L_G1,0,y,t1,a1,b1);
f:=f+b1;
end;
for y:=0 to L_G1.Socanh -1 do
if L_G1.DSCanh[y].DinhCuoi =L_G1.SoDinh -1 then
begin
break;
end;
tam:=0;
t2:=1;
while (t2<=L_G1.sodinh-2) do
begin
if t2 in L_v1 then
L_G1.dsdinh[t2].MucKichHoat :=3
else
L_G1.dsdinh[t2].MucKichHoat :=0;
end;
t2:=t2+1;
end;
L_G1.dsdinh[0].MucKichHoat :=3;
L_G1.dsdinh[L_G1.SoDinh -1].MucKichHoat :=0;