CH NG VƯƠ
M T S I TOÁN T I U TRÊN Đ TH Ư
5.1. Đ TH CÓ TR NG S VÀ BÀI TOÁN Đ NG ĐI NG N NH T. ƯỜ
5.1.1. M đ u:
Trong đ i s ng, chúng ta th ng g p nh ng nh hu ng nh sau: đ đi t đ a ườ ư
đi m A đ n đ a đi m B trong thành ph , nhi u đ ng đi, nhi u cách đi; lúc ta ế ườ
ch n đ ng đi ng n nh t (theo nghĩa c ly), có lúc l i c n ch n đ ng đi nhanh nh t ườ ườ
(theo nghĩa th i gian) lúc ph i cân nh c đ ch n đ ng đi r ti n nh t (theo ườ
nghĩa chi p), v.v...
Có th coi s đ c a đ ng đi t A đ n B trong thành ph m t đ th , v i ơ ườ ế
đ nh các giao l (A và B coi nh giao l ), c nh đo n đ ng n i hai giao l . Trên ư ườ
m i c nh c a đ th này, ta gán m t s d ng, ng v i chi u dài c a đo n đ ng, ươ ườ
th i gian đi đo n đ ng ho c c c phí v n chuy n trên đo n đ ng đó, ... ườ ướ ườ
Đ th tr ng s đ th G=(V,E) m i c nh (ho c cung) e E đ c gánượ
b i m t s th c m(e), g i là tr ng s c a c nh (ho c cung) e.
Trong ph n này, tr ng s c a m i c nh đ c xét là m t s d ng vàn g i là ượ ươ
chi u dài c a c nh đó. M i đ ng đi t đ nh u đ n đ nh v, chi u dài m(u,v), ườ ế
b ng t ng chi u dài các c nh mà nó đi qua. Kho ng cách d(u,v) gi a hai đ nh u và v là
chi u dài đ ng đi ng n nh t (theo nghĩa m(u,v) nh nh t) trong các đ ng đi t u ườ ườ
đ n v.ế
Có th xem m t đ th G b t kỳm t đ th có tr ng s mà m i c nh đ u
chi u dài 1. Khi đó, kho ng ch d(u,v) gi a hai đ nh u v chi u dài c a đ ng đi ườ
t u đ n v ng n nh t, t c là đ ng đi qua ít c nh nh t. ế ườ
5.1.2. Bài toán tìm đ ng đi ng n nh t:ườ
Cho đ n đ th liên thông, có tr ng s G=(V,E). Tìm kho ng cách d(uơ 0,v) t m t
đ nh u0 cho tr c đ n m t đ nh v b t kỳ c a G và tìm đ ng đi ng n nh t t uướ ế ườ 0 đ n v.ế
Có m t s thu t toán m đ ng đi ng n nh t; đây, ta thu t toán do E. ườ
Dijkstra, n toán h c ng i Hà Lan, đ xu t năm 1959. Trong phiên b n mà ta s trình ườ
y, ng i ta gi s đ th h ng, các tr ng s d ng. Ch c n thay đ i đôiườ ướ ươ
chút là có th gi i đ c bài tn tìm đ ng đi ng n nh t trong đ th có h ng. ượ ườ ướ
Ph ng pháp c a thu t toán Dijkstra là: xác đ nh tu n t đ nh kho ng cáchươ
đ n uế0 t nh đ n l n. ế
Tr c tiên, đ nh có kho ng cách đ n a nh nh t chính là a, v i d(uướ ế 0,u0)=0. Trong
các đ nh v u0, tìm đ nh kho ng cách k 1 đ n uế0 nh nh t. Đ nh y ph i m t
trongc đ nh k v i u 0. Gi s đó là u 1. Ta có:
d(u0,u1) = k1.
67
Trong các đ nh v u0 v u1, tìm đ nh kho ng cách k 2 đ n uế0 nh nh t. Đ nh
y ph i là m t trong các đ nh k v i u 0 ho c v i u 1. Gi s đóu 2. Ta có:
d(u0,u2) = k2.
Ti p t c nh trên, cho đ n bao gi tìm đ c kho ng cách t uế ư ế ượ 0 đ n m i đ nh v c a G.ế
N u V={uế0, u1, ..., un} thì:
0 = d(u0,u0) < d(u0,u1) < d(u0,u2) < ... < d(u0,un).
5.1.3. Thu t toán Dijkstra:
procedure Dijkstra (G=(V,E) là đ n đ th liên thông, có tr ng s v i tr ng s d ng)ơ ươ
{G có các đ nh a=u0, u1, ..., un=z và tr ng s m(u i,uj), v i m(ui,uj) =
n u (uếi,uj) kngm t c nh trong G}
for i := 1 to n
L(ui) :=
L(a) := 0
S := V \ {a}
u := a
while S
begin
for t t c các đ nh v thu c S
if L(u) +m(u,v) < L(v) then L(v) := L(u)+m(u,v)
u := đ nh thu c S nhãn L(u) nh nh t
{L(u): đ dài đ ng đi ng n nh t t a đ n ườ ế
u}
S := S \ {u}
end
Thí d 1: Tìm kho ng cách d(a,v) t a đ n m i đ nh v và tìm đ ng đi ng n nh t t a ế ườ
đ n v cho trong đ th G sau.ế
68
a
n
b
e
d
g
m
c
h
k
1
3
3
2
1
4
2
4
2
6
2
3
5
5
6
3
1
2
3
L(a) L(b) L(c) L(d) L(e) L(g) L(h) L(k) L(m) L(n)
5.1.4. Đ nh lý: Thu t toán Dijkstra m đ c đ ng đi ng n nh t t m t đ nh cho ượ ườ
tr c đ n m t đ nh tuỳ ý trong đ n đ th vô h ng liên thông có tr ng s .ướ ế ơ ướ
Ch ng minh: Đ nh lý đ c ch ng minh b ng quy n p. T i b c k ta có gi thi t quy ượ ướ ế
n p là:
(i) Nhãn c a đ nh v không thu c S là đ dài c a đ ng đi ng n nh t t đ nh a t i đ nh ườ
y;
(ii) Nhãn c a đ nh v trong S là đ dài c a đ ng đi ng n nh t t đ nh a t i đ nh này và ườ
đ ng điy ch ch a các đ nh (ngoài chính đ nh này) kng thu c S.ườ
Khi k=0, t c khi ch a b c l p nào đ c th c hi n, S=V \ {a}, th đ ư ướ ượ ế
i c a đ ng đi ng n nh t t a t i các đ nh khác a ườ đ dài c a đ ng đi ng n ườ
nh t t a t i chính b ng 0 ( đây, chúng ta cho phép đ ng đi không c nh). Do ườ
đó b c c s đúng.ướ ơ
Gi s gi thi t quy n p là đúng v i b c k. G i vđ nh l y ra kh i S b c ế ư ướ
l p k+1, v y v đ nh thu c S cu i b c k nhãn nh nh t (n u nhi u đ nh ướ ế
69
0
33 2
1
5 2 2
3
3
25
4 6 3
66
4
10 6
6
968
7
8
8
có nhãn nh nh t thì có th ch n m t đ nh nào đó làm v). T gi thi t quy n p ta th y ế
r ng tr c khi vào vòng l p th k+1, các đ nh không thu c S đã đ c gán nhãn b ng ướ ượ
đ dài c a đ ng đi ng n nh t t a. Đ nh v cũng v y ph i đ c n nhãn b ng đ i ườ ượ
c a đ ng đi ng n nh t t a. N u đi u này không x y ra t cu i b c l p th k s ườ ế ướ
đ ng đi v i đ dài nh h n Lườ ơ k(v) ch a c đ nh thu c S (vì L k(v) đ dài c a
đ ng đi ng n nh t t a t i v ch a ch các đ nh không thu c S sau b c l p th k).ườ ướ
G i u đ nh đ u tiên c a đ ng đi này thu c S. Đó đ ng đi v i đ dài nh h n ườ ườ ơ
Lk(v) t a t i u ch a ch các đ nh không thu c S. Đi u này trái v i cách ch n v. Do đó
(i) v n còn đúng cu i b c l p k+1. ướ
G i u là đ nh thu c S sau b c k+1. Đ ng đi ng n nh t t a t i u ch a ch các ướ ườ
đ nh không thu c S s ho c là ch a v ho c là không. N u nó không ch a v thì theo gi ế
thi t quy n p đ dài c a Lế k(v). N uch a v thì nó s t o thành đ ng đi t aế ườ
t i v v i đ dài th ng n nh t ch a ch các đ nh không thu c S khác v, k t thúc ế
b ng c nh t v t i u. Khi đó đ dài c a nó s là L k(v)+m(v,u). Đi u đó ch ng t (ii) là
đúng vì Lk+1(u)=min(Lk(u), Lk(v)+m(v,u)).
5.1.5. M nh đ : Thu t toán Dijkstra tìm đ ng đi ng n nh t t m t đ nh cho tr c ườ ướ
đ n m t đ nh tuỳ ý trong đ n đ th vô h ng liên thông có tr ng s có đ ph c t p làế ơ ướ
O(n2).
Ch ng minh: Thu t toán ng không quá n1 b c l p. Trong m i b c l p, ngướ ướ
không h n 2(nơ1) phép c ng phép so sánh đ s a đ i nhãn c a các đ nh. Ngoài ra,
m t đ nh thu c S knhãn nh nh t nh không quá n 1 phép so sánh. Do đó thu t toán
đ ph c t p O(n 2).
5.1.6. Thu t toán Floyd:
Cho G=(V,E) m t đ th h ng, tr ng s . Đ tìm đ ng đi ng n nh t ướ ườ
gi a m i c p đ nh c a G, ta th áp d ng thu t toán Dijkstra nhi u l n ho c áp d ng
thu t toán Floyd đ c trình y d i đây. ượ ướ
Gi s V={v 1, v2, ..., vn} ma tr n tr ng s W W0. Thu t toán Floyd
y d ng y các ma tr n vng c p n là W k (0 k n) nh sau:ư
procedure Xác đ nh Wn
for i := 1 to n
for j := 1 to n
W[i,j] := m(vi,vj) {W[i,j] là ph n t ng i c t j c a ma tr n W 0}
for k := 1 to n
if W[i,k] +W[k,j] < W[i,j] then W[i,j] := W[i,k] +W[k,j]
{W[i,j] là ph n t ng i c t j c a ma tr n W k}
70
5.1.7. Đ nh lý: Thu t toán Floyd cho ta ma tr n W*=W n ma tr n kho ng cách nh
nh t c a đ th G.
Ch ng minh: Ta ch ng minh b ng quy n p theo k m nh đ sau:
Wk[i,j] chi u dài đ ng đi ng n nh t trong nh ng đ ng đi n i đ nh v ườ ườ i v i
đ nh vj đi qua các đ nh trung gian trong {v1, v2, ..., vk}.
Tr c h t m nh đ hi n nhiên đúng v i k=0.ướ ế
Gi s m nh đ đúng v i k-1.
Xét Wk[i,j]. Có hai tr ng h p:ườ
1) Trong các đ ng đi chi u i ng n nh t n i vườ i v i vj đi qua các đ nh trung gian
trong {v1, v2, ..., vk}, có m t đ ng đi ườ γ sao cho vk γ. Khi đó γng là đ ng đi ng nườ
nh t n i v i v i vj đi qua các đ nh trung gian trong {v1, v2, ..., vk-1}, nên theo gi thi t quy ế
n p,
Wk-1[i,j] = chi u dài γ Wk-1[i,k]+Wk-1[k,j].
Do đó theo đ nh nghĩa c a W k thì Wk[i,j]=Wk-1[i,j].
2) M i đ ng đi chi u dài ng n nh t n i v ườ i v i vj đi qua các đ nh trung gian trong
{v1, v2, ..., vk}, đ u ch a v k. G i γ = vi ... vk ... vj là m t đ ng đi ng n nh t nh th thì ườ ư ế
v1 ... vk vk ... vj cũng nh ng đ ng đi ng n nh t đi qua các đ nh trung gian trong ườ
{v1, v2, ..., vk-1} và
Wk-1[i,k]+Wk-1[k,j] = chi u dài(v1 ... vk) + chi u dài(vk ... vj)
= chi u dài γ < Wk-1[i,j].
Do đó theo đ nh nghĩa c a W k thì ta có:
Wk[i,j] = Wk-1[i,k]+Wk-1[k,j] .
Thí d 2:t đ th G sau:
Áp d ng thu t toán Floyd, ta tìm đ c (các ô tr ng ượ )
W = W0 =
1
22
4
3
14
27
71
v1
v2
v3
v4
v5
v6
4
7
22
4
1
1
2
3