8.7. BUONG DI SCTE Gita MOQI CAP DINH - THUAT TOAN FLOYD
6 chu trink
luéng, c6 trong so G = (V, B) véi n din va m canh, Bai toan dat ra 1a hay
tinh tt c4 cde d(u, v) ld khodng céch tir u téi v, R6 rang la ta c6 thé 4p dung thuat ton tim
duéng di ngin nbdt xuat phét tir mt dinh v6i n kha nang chon dinh xudt phat. Nhimg ta e6
céch lam gon hon nhiéu, cach lim nay rat giéng véi thuat toan Warshall ma ta da biét: Tir ma
trn trong sé c, thuat todn Floyd tinh lai cdc c[u, v] thanh 6 dai duéng di ngin nat tiru ti v:
Voi moi dinh k cia d6 thi duge xét theo thir ty tir 1 téi n, xét moi cfp dinh u, v. Cye tigu hod
c[u, v] theo céng thitc:
cu, v] = min(efu, v], cfu, k] + efk, v])
Tite 14 néu nhu during di tir u t6i v dang c6 lai dai hon duimg di tir u toi k cOng véi dudmg di
tirk t6i y thi ta huy bo during di tir u t6i v hign thoi va coi dudng di tir u téi v sé 1A néi cia hai
dudng di tir u t6i k rdi tir k t6i v (Chui y ring ta cn c6 viée hum lai vét):
elu, v] := min(efo, vl, cfu, k] + eft, v1);
Tinh ding cia thuat todn:
Goi ck{u, v] 1a d6 dai duong di ngin nhdt tir u téi v ma chi di qua céc dinh trung gian thude
tap {1, 2, ..., k}. RG ring khi k = 0 thi cfu, v] = cfu, v] (dung di ngin nhét la dung di tree
Gia str ta da tinh duge cac c*"[u, v] thi c*{u, v] sé duge xy dumg nhu sau:
Néu duéng di ngin nhat tir u téi v ma chi qua céc dinh trung gian thudc tap {1, 2, ..., k} lai:
* Kh6ng di qua dinh k thi tie 1a chi qua cdc dinh trung gian thugc tap {1, 2, ...,k~ 1} thi
cfu, vy] = ck" [u, v]
+ C6 di qua dinh k thi dug di dé sé 1A néi cha mét dung di tir u t6i k va mot dudng di tirk
t6i v, hai dung di nay chi di qua cdc dinh trung gian thuge tip {1, 2, ..., k- 1}.
cfu, v) =c'[u, k] + c*'[k, v].
Vi ta muén c*[u, v] li oye tiéu nén suy ra: e[u, v] = min(c*"fu, v), Tu, k] +c'[k, vp).
DHSPHN 1999-2004Ly thuyét 48 thj Use
‘Va cui cing, ta quan tim t6i c"[u, v]: D6 dai dung i ngdin nhit ti u t6i v ma chi di qua cde
inh trung gian thugc tip {1, 2, ...,.m}.
Khi cai dat, thi ta sé khdng cé cdc khdi nigm ¢'[u, v] ma sé thao tac trvc tiép trén cae trong sé
cfu, v]. efu, v] tai bude t6i uu thir k s& duge tinh toan dé tdi uu qua cde gid tri c[u, v]; cfu, kK)
va clk, v] tai bude thir k- 1. Tinh chinh xéc ca céch cai dat duéi dang ba vong lap for
nhu trén c6 thé thdy duge do su t6i wu bic cau chi lim tin; téc d6 t6i wu cdc c[u, v] trong mé
bude ( Xem Lac sutar uu bic cats aia Hust tazm Fond Bellman),
RE a
({0E DELPET) (This progran uses 32-bit Integer
progran Shortest Path by Floyd;
const
TnpotFile = 'MINPATH. INP";
utputrile = "MnnpATH. OUT";
sax = 1000;
saxtC = 10
sax = max * naxiC;
+ array[1..nax, 1..max) of Integer;
‘race: array[1. max, 1. max] of Integer; (Trace(u, v] = Binh 1ién san u trén dung di
by sy f: Integer;
ch t6t
procedure LoadGraph; (tp
iy a, uy v: Integer;
hy Text;
Degin
Aseign( fi, IaputFile); Reset (f1);
aadla(ti, a, a, 5, £);
foru:e1 toad
forv =i toa do
4a =y then oft, v] := 0 else clo, v] := masts
fa, 48 thi Bifog dope 6 cba
for i c= 1 tom do Readia(ti, u, v, eft, vl);
Close (ti);
ed;
procedure Floyd
mar
, a, vs Integers
begin
fora :=1 ton d>
for v := 1 to n do Teace[u, v] ce vi (Gia si dvéng gla nt ofa mph ofp dlnh 18 aatag trie tilp)
{thuft toin Floy
fork := 1 ton do
for u i= 1 to n do
fory #1 toad
if clu, v1 > elt, EI + elk, v) then (Dvdng 4: tb qua k tht on)
begin
fy, wf := ef, E] + elk, o]
‘eace(y, v] := Trace(u, 7
nd
(Gh shan nig 5 ehay eho ang)
(uu wht ving i)
nd;
prscedare Printenst (on didn 4th st6i fh
fo: tet:
basi
‘Resign (fo, output); Revrte(fo)
if cls, f] = mat286
else
begin
Writela(fo, "Distance fron", , ' to', £,'
repeat.
Write(fo, 5, '->');
8 := Trace[s, f]; {whic lai ring Trace(s, f) 18 dinh lin sau s trén dung di tdi £)"
until s
Writeln(fo, £);
end;
Close fo)
end
begin
Toadsraph;
Floyd
PrintResult;
end,
then Writeln(fo, "There is no path from ', 5, '
to, £)
pty els, ile
Khac biét r3 ring cia thuat ton Floyd 1a khi can tim duéng di ngin nat gitta mot cap dinh
Khéc, churong trinh chi vie in két qua chit khéng phai thyc hign Iai thuat todn Floyd nia