CH NG 6ƯƠ
BÀI TOÁN Đ NG ĐI NG N NH TƯỜ
1. Các khái ni m
Trong ch ng này chúng ta ch xét đ th có h ng G =(V,E), |V|=n, |E|=m v i các cung đ cươ ướ ượ
n tr ng s , nghĩa là, m i cung (u,v)
E c a nó đ c đ t t ng ng v i m t s th c a(u,v) ượ ươ
g i là tr ng s c a nó. Chúng ta s đ t a(u,v) =
, n u (u,v) ế
E.
N u dãy vế0, v1, . . ., vp m t đ ng đi trên G, thì đ i đ ng đi là t ng c a các tr ng s trên ườ ườ
các cung c a nó:
=
p
i
ii
vva
1
1
),(
(n u gán tr ng s cho t t c cung b ng 1, thì đ dài c a đ ng đi là s cung c a đ ng đi.)ế ườ ườ
Đ ng đi ng n nh t t đ nh s đ n đ nh t là đ ng đi có đ dài nh nh t t s đ n t, đ i c aườ ế ườ ế
nó ký hi u là d(s,t). d(s,t) còn g i là kho ng cách t s đ n t. N u không có đ ng đi t s đ n t ế ế ườ ế
thì ta s đ t d(s,t)=
.
N u bi t kho ng cách t s đ n t, thì đ ng đi ng n nh t t s đ n t, trong tr ng h p tr ng sế ế ế ườ ế ườ
không âm, có th tìm đ c m t cách d dàng. Đ tìm đ ng đi, ch c n đ ý đ i v i c p ượ ườ
đ nh s, t
V tuỳ ý (s
t) luôn tìm đ c đ nh v sao choượ
d(s,t) = d(s,v) + a(v,t).
Th c v y, đ nh v nh v y chính đ nh đi tr c đ nh t trong đ ng đi ng n nh t t s đ n t. ư ướ ườ ế
Ti p theo ta l ith tìm đ c đ nh u sao cho d(s,v) = d(s,u) + a(u,v), . . . T đó ta có thu tế ượ
toán sau đây đ tìm đ ng đi ng n nh t t s đ n t khi bi t đ dài c a nó. ườ ế ế
void Find_Path()
/*
Đ u vào:
d[v] kho ng cách t đ nh s đ n đ nh v ế
V; t là đ nh đích;
a[u,v], u, v
V là ma tr n tr ng s trênc cung.
Đ u ra:
M ng stack ch a dãy đ nhc đ nh đ ng đi ng n nh t t s đ n t ườ ế
*/
{
stack=
φ
; stack
t; v=t;
while (v != s)
{
u=đ nh tho n d[v]=d[u]+a[u,v];
stack
u;
v=u;
}
}
Nh n xét:
-Đ ph c t p tính toán c a thu t toán O(n 2), do đ tìm đ nh u ta ph i xét qua t t c các
đ nh c a đ th .
1
- th dùng bi n m ng Truoc[v], đ ghi nh đ nh đi tr c v trong đ ng đi tìm ki m (khong ế ướ ườ ế
ng m ng stack)
2. Đ ng đi ng n nh t xu t phát t m t đ nhườ
Ph n l n các thu t toán tìm kho ng cách gi a hai đ nh s và t đ c xây d ng nh sau: ượ ư
Tính c n trên d[v] c a kho ng cách t s đ n t t c các đ nh v ế
V. M i khi phát hi n
d[u] + a[u,v] < d[v] (1)
c n trên d[v] s đ c làm t t lên v i giá tr m i: d[v]= d[u] + a[u,v]. ượ
Quá trình đó s k t thúc khi không làm t t thêm đ c b t kỳ c n trên nào. Khi đó, ràng giá ế ượ
tr c a m i d[v] s cho kho ng cách t đ nh s đ n đ nh v. C n trên d[v] s đ c g i nhãn ế ượ
c a đ nh v, còn vi c tính l i các c n này s đ c g i là th t c gán nhãn. ượ
Nh n th y r ng đ tính kho ng cách t s đ n t, đây, ta ph i tính kho ng cách t s đ n t t ế ế
c các đ nh còn l i c a đ th . Hi n nay v n ch a bi t thu t toán nào cho phép tìm đ ng đi ư ế ườ
ng n nh t gi a hai đ nh làm vi c th c s hi u qu h n nh ng thu t toán tìm đ ng đi ng n ơ ườ
nh t t m t đ nh đ n t t c các đ nhn l i. ế
S đ tính toán ta v a mô t n ch a xác đ nh, b i vì còn ph i ch ra th t c đ nh u vàơ ư
v đ ki m tra đi u ki n (1). Th t ch n này nh h ng r t l n đ n hi u qu c a thu t ưở ế
toán.
Bây gi ta s mô t thuât toán Ford-Bellman tìm đ ng đi ng n nh t t đ nh s đ n t t c các ườ ế
đ nh còn l i c a đ th . Thu t toán làm vi c trong tr ng h p tr ng s c a các cung tuỳ ý, ườ
nh ng gi thi t r ng trong đ th không có chu trình âm. ư ế
void Ford_Bellman()
/*
Đ u vào:
Đ th h ng G=(V,E) v i n đ nh, ướ
s là đ nh xu t phát, a[u,v] là ma tr n tr ng s ;
Gi thi t: Đ th không chu trình âm. ế
Đ u ra:
Kho ng cách t đ nh s đ n t t c c đ nh còn l i d[v] ế
Tr c[v] ghi nh n đ nh đi tr c v trong đ ng đi ng n nh t t s đ n v.ướ ướ ườ ế
*/
{
// Kh i t o
for (v
V)
{
d[v]=a[s,v];
Truoc[v]=s;
}
d[s]=0;
//cac lenh lap
for (k=1;k<= n-2;k++)
for (v
V\{s})
2
for (u
V)
if (d[v] > d[u] +a[u,v])
{
d[v]=d[u]+a[u,v];
Truoc[v]=u;
}
}
Tính đúng đ n c a thu t toán th ch ng minh trên c s trên nguyên t i u c a quy ơ ư
ho ch đ ng. Rõ ràng là đ ph c t p tính toán c a thu t toán là O(n 3). L u ý r ng chúng ta cóư
th ch m d t vòng l p theo k khi phát hi n trong quá trình th c hi n hai vòng l p trong không
bi n d[v] nào b đ i giá tr . Vi c này th x y ra đ i v i k<n-2, đi u đó làm tăng hi uế
qu c a thu t toán trong vi c gi i các bài toán th c t . Tuy nhiên, c i ti n đó không th c s ế ế
c i thi n đ c đánh giá đ ph c t p c a b n thân thu t toán. Đ i v i đ th th a t t h n là s ượ ư ơ
d ng danh sách k Ke(v), vv V, đ bi u di n đ th , khi đó vòng l p theo u c n vi t l i d i ế ướ
d ng
For u v
If d[v] > d[u] + a[u,v] then
Begin
D[v]:=d[u]+a[u,v];
Truoc[v]:=u;
End;
Trong tr ng h p này ta thu đ c thu t toán v i đ ph c t p O(n,m).ườ ượ
Thí d 1. xét đ th trong hình 1. Các k t qu tính toán theo thu t toán đ c mô t trong b ng ế ư
d i đâyướ
2 2 2 2
3 3 8
A= = = = 1 -5
4 4
Hình 1. Minh h a thu t toán Ford_Bellman
k d[1]
Truoc[1]
d[2]
Truoc[2]
d[3]
Truoc[3]
d[4]
Truoc[4]
d[5]
Truoc[5]
0,1 1,1 1 ,1 1 ,1 3,1
3
1 0,1 1,1 4,2 4,2 -1,3
2 0,1 1,1 4,2 3,5 -1,3
3 0,1 1,1 4,2 3,5 S
B ng k t qu tính toán theo thu t toán Ford_Bellman ế
Trong các m c ti p theo chúng ta s xét m t s tr ng h p riêng c a bài toán m đ ng đi ế ườ ư
ng n nh t đ gi i chúng th xây d ng nh ng thu t toán hi u qu h n thu t toán ơ
Ford_Bellman. Đó khi tr ng s c a t t c các cung các s không âm ho c khi đ th
không chu trình.
3. TR NG H P MA TR N TR NG S KHÔNG ÂM - THU T TOÁN DIJKSTRAƯỜ
Trong tr ng h p tr ng s trên các cung là không âm thu t toán do Dijkstra đ ngh làm vi cườ
h u hi u h n r t nhi u so v i thu t toán trình bày trong m c tr c. Thu t toán đ c xây d ng ơ ướ ượ
d a trên c s gán cho các đ nh các nhãn t m th i. Nhãn c a m i đ nh cho bi t c n c a đ ơ ế
dài đ ng đi ng n nh t t s đ n nó. Các nhãn này s đ c bi n đ i theo m t th t c l p, màườ ế ượ ế
m i b c l p có m t nhãn t m th i tr thành nhãn c đ nh. N u nhãn c a m t đ nh nào đó ướ ế
tr thành m t nhãn c đ nh thì nó s cho ta không ph i là c n trên mà là đ dài c a đ ng đi ườ
ng n nh t t đ nh s đ n nó. Thu t toán đ c mô t c th nh sau. ế ượ ư
Procedure Dijstra;
(*
Đ u vào:
Đ th h ng G=(v,E) v i n đ nh, ướ
s V là đ nh xu t phát, a[u,v], u,v V, ma trr n tr ng s ; ậọ
Gi thi t: a[u,v]≥0, u,v V. ế
Đ u ra:
Kho ng cách t đ nh s đ n t t c c đ nh còn l i d[v], v V. ế
Truoc[v], v V, ghi nh n đ nh đi tr c v trong đ ng đi ng n ướ ườ
nh t t s đ n v ế
*)
Begin
(* Kh i t o *)
for v u V do
begin
d[v]:=a[s,v];
Truoc[v]:=s;
end;
d[s]:=0; T:=V\\ ss ; (* T là tt p các đ nh nhãn t m th i *)ậỉ
(* B c l p *)ướ
while T <> ; do
begin
tìm đ nh u T tho mãn d[u]=minn d[z]:z TT ;
T:=T\\ uu ; (* CC đ nh nhãn c a đ nh u*)ốị
For v T do
4
If d[v]>d[u]+a[u,v] then
Begin
d[v]:=d[u]+a[u,v];
Truoc[v]:=u;
End;
end;
End;
Đ nh1. Thu t toán Dijkstra tìm đ c đ ng đi ng n nh t trên đ th sau th i gian c O(n ượ ườ 2).
Ch ng minh.
Tr c h t ta ch ng minh thu t toán tìm đ c đ ng đi ng n nh t t đ nh s đ n các đ nhướ ế ượ ườ ế
còn l i c a đ th . Gi s m t b c l p nào đó các nhãn c đ nh cho ta đ i các đ ng đi ướ ườ
ng n nh t t s đ n các đ nh có nhãn c đ nh, ta s ch ng minh r ng l n g p ti p theo n u ế ế ế
đ nh u* thu đ c nhãn c đ nh d(u*) chính là đ i đ ng đi ng n nh t t s đ n u*. ượ ườ ế
hi u S1 t p h p các đ nh có nhãn c đ nh còn S 2 t p các đ nhnhãn t m th i b c ướ
l p đang xét. K t thúc m i b c l p nhãn t m th i d(u ế ướ *) cho ta đ dài c a đ ng đi ng n nh t ườ
t s đ n u* không n m tr ng trong t p S ế 1, t c là nó đi qua ít nh t m t đ nh c a t p S 2. G i z
S2 đ nh đ u tiên nh v y trên đ ng đi này. Do tr ng s trên các cung không âm, nên ư ườ
đo n đ ng t z đ n u* đ dài L>0 ườ ế
d(z) < d(u*) – L < d(u*).
B t đ ng th c này là mâu thu n v i cách xác đ nh đ nh u* đ nh có nhãn t m th i nh nh t.
V y đ ng đi ng n nh t t s đ n u* ph i n m tr n trong S ườ ế 1, th , d[u*] đ dài c a nó.ế
Do l n l p đ u tiên S 1 = ss và sau mmi l n l p ta ch thêm vào m t đ nh u* nên gi thi tỗầ ế
là d(v) cho đ dài đ ng đi ng n nh t t s đ n v v i m i v S ườ ế 1 là đúng v i b c l p đ u tiên. ướ
Theo qui n p suy ra thu t toán cho ta đ ng đi ng n nh t t s đ n m i đ nh c a đ th . ườ ế
Bây gi ta s đánh giá s phép toán c n th c hi n theo thu t toán. û m i b c l p đ tìm ra Ơ ướ
đ nh u c n ph i th c hi n O(n) phép toán, đ n nhãn l i cũng c n th c hi n m t s
l ng phép toán cũng O(n). thu t toán ph i th c hi n n-1 b c l p, v y th i gian tínhượ ướ
toán c a thu n toán c O(n 2).
Đ nh lý đ c ch ng minh. ượ
Khi tìm đ c đ dài c a đ ng đi ng n nh t d[v] thì đ ng đi này th tìm d a vào nhãnượ ườ ườ
Truoc[v], vv V, theo qui t c gi ng nh chúng ta đã xét trong ch ng 3. ư ươ
Thí d 2. Tìm đ ng đi ng n nh t t 1 đ n các đ nh còn l i c a đ th hình 2. ườ ế
Hình 2. Minh h a thu t toán Dijkstra
5