BÀI 14
Chương 8
Bài toán đường đi ngn nht
Trước mi chuyến xut hành, chúng ta thường phi suy nghĩ và chn ra cho
mình mt hành trình “tiết kim” nht theo nghĩa tn ít thi gian, tn ít nhiên liu
hoc tn ít tin nht … Lý thuyết Đồ th s giúp chúng ta tìm ra gii pháp đó.
8.1. Bài toán Đường đi ngn nht
Bài toán: Cho đồ th G = (V, E) và hai đỉnh a, b. Tìm đường đi ngn nht (nếu có)
đi t đỉnh a đến đỉnh b trong đồ th G.
ý nghĩa thc tế: Bài toán này giúp chúng ta chn các hành trình tiết kim nht
(quãng đường, thi gian, chi phí ...) trong giao thông, lp lch thi công các công
trình mt cách ti ưu, x lý trong truyn tin ...
Thut toán duyt đồ th theo chiu rng đã cho ta li gii ca bài toán này.
Song ta có thêm thut toán sau đây.
Thut toán 8.1:
1. Ln lượt gán nhãn cho các đỉnh ca đồ th, mi đỉnh không quá mt ln, như sau:
- Đỉnh a được gán nhãn là s 0.
- Nhng đỉnh k vi đỉnh a được gán s 1.
- Nhng đỉnh k vi đỉnh đã được gán nhãn s 1, được gán s 2.
………………………………….
- Tương t, nhng đỉnh k vi đỉnh đã được gán s i được gán nhãn là s
i+1.
………………………………….
Thc hin cho đến khi gán được nhãn cho đỉnh b hoc không gán nhãn
được na.
2. Nếu đỉnh b được gán nhãn nào đó là k thì kết lun có đường đi ngn nht t
đỉnh a ti đỉnh b vi độ dài k, ngược li thì tr li là không có.
3. Khôi phc đường đi: Nếu bước 2. ch ra b được gán nhãn k nào đó thì ta đi
ngược li theo quy tc sau đây: Nếu đỉnh y được gán nhãn j vi j 1 thì s
đỉnh x được gãn nhãn j-1 sao cho có cnh đi t x ti y. Đi ngược li cho đến khi
gp đỉnh a, ta nhn được đường đi ngn nht cn tìm.
Ví d 8.1 (Bài toán con sói, con dê và cái bp ci):
Mt con sói, mt con dê và mt cái bp ci đang b sông. Người lái đò
phi đưa chúng sang sông. Nhưng thuyn quá bé nên mi chuyến ch ch được mt
“hành khách” thôi. Vì nhng lý do mà ai cũng biết, không th b mc sói vi dê
hoc dê vi bp ci mà không có người trông. Vy người lái đò phi x trí thế nào
mà vn đưa được sói, dê và bp ci sang bên kia sông.
Xây dng đồ th vô hướng vi các đỉnh th hin các hành khách còn li bên
phía xut phát ti mi thi đim khác nhau. Cnh ni hai đỉnh th hin mt chuyến
đò qua sông.
Hình 8.1. Hành trình qua sông ca sói, dê và bp ci
Bài toán đưa v vic tìm đường đi ngn nht t đỉnh a đến đỉnh b trên đồ th.
Đường đi như thế được ch ra bi các mũi tên hình trên.
8.2. Bài toán Đường đi có trng s bé nht
Vi bài toán đường đi tng quát, ta xét các đồ th có trng s được định
nghĩa như sau.
Định nghĩa 8.2:
Đồ th G được gi là đồ th có trng s nếu trên mi cnh (i, j) ca đồ th được
gán mt s nguyên không âm c(i,j).
Nhãn c(i,j) trên cnh (i,j) ca đồ th thường biu din “chi phí” thc tế để đi qua
cnh này.
Ta thường ký hiu đồ th có trng s là (G, c).
Độ dài ca đường đi trong đồ th có trng s bng tng các trng s ca các
cnh trên đường đi đó.
Bài toán: Cho đồ th có trng s (G, c) và hai đỉnh a, b thuc G. Hãy tìm đường
đi có trng s bé nht (nếu có) đi t đỉnh a đến đỉnh b.
Độ dài đường đi ngn nht t đi đỉnh a đến đỉnh b còn được gi là khong
cách t đỉnh a đến đỉnh b trong đồ th. Nếu không có đường đi t a đến b thì
đặt khong cách bng .
8.3. Thut toán Dijkstra tìm đường đi ngn nht
Năm 1959 E. W. Dijkstra đưa ra mt thut toán rt hiu qu để gii bài toán
đường đi ngn nht.
Thut toán thc hin vic gán và gim giá tr ca nhãn l(i) ti mi đỉnh i
ca đồ th G như sau:
Thut toán 8.2 (Tìm đường đi ngn nht):
1. Vi đỉnh xut phát a, gán nhãn l(a) := 0.
2. Nếu có cnh (i,j) mà đỉnh i đã được gán nhãn và đỉnh j chưa được gán
nhãn hoc đỉnh j đã được gán nhãn nhưng l(i) + c(i,j) < l(j) thì gim nhãn
l(j) := l(i) + c(i,j).
3. Lp li bước 2. cho đến khi không gán hoc gim nhãn được na.
Định lý 8.3: Ti mi đỉnh b giá tr nhãn l(b) cui cùng (nếu có) chính là độ dài
ca đường đi ngn nht t đỉnh a đến đỉnh b.
Chng minh:
Sau khi đã thc hin xong thut toán trên, nếu giá tr nhãn l(b) xác định thì ta có
đường đi t đỉnh a ti đỉnh b.
Ta khôi phc đường đi t a đến b như sau:
Xut phát t đỉnh b, tìm cnh có đỉnh cui là bđỉnh đầu là i sao cho:
l(i) + c(i,b) = l(b).
Đỉnh i như thế chc chn phi tn ti vì xy ra đẳng thc ln gán hoc gim giá
tr nhãn l(j) cui cùng. C tiếp tc như thế cho đến khi gp đỉnh a.
Gi s ta nhn được dãy các cnh:
(a, a1) , (a1, a2) , ... , (ak-1, b)
mà trên đó: l(a) + c(a,a1) = l(a1)
l(a1) + c(a1,a2) = l(a2)
.. . .. . . . .. .. .. . . .. .. . .
l(ak-1) + c(ak-1, b) = l(b).
Cng tng vế và kh các giá tr chung c hai vế ta có:
c(a,a1) + c(a1,a2) + ... + c(ak-1,b) = l(b).
Vy giá tr nhãn l(b) chính là độ dài đường đi nói trên.
Bt k đường đi nào khác t đỉnh a đến đỉnh b cũng có các h thc tương t
nhưng có du .
Vy nhãn l(b) là độ dài ca đường đi ngn nht.
Ví d 8.3: Xét đồ th có trng s sau đây:
Hình 8.2. Đồ th có trng s
Độ dài đường đi ngn nht t đỉnh a đến đỉnh b là 5.
Để đơn gin vic tính toán, ta xây dng ma trn trng s C :
c(i,j) , nếu (i, j) E
C[i,j] = , nếu (i, j) E
0 , nếu i = j.
Khi đó, thut toán Dijkstra được trình bày chi tiết hơn như sau:
1 procedure DIJKSTRA(a) ;
2 begin
3 for j V do
4 begin
5 L[j] := C[a, j] ; Truoc[j] := a
6 end ;
7 T := V \ {a} ;
8 while T do
9 begin
10 chn đỉnh i T L[i] = min {L[j] j T } ;
11 T := T \ {i} ;
12 for j T do
13 if L[j] > L[i] + C[i, j] then
14 begin
15 L[j] := L[i] + C[i, j] ;
16 Truoc[j] := i ;
17 end ;
18 end ;
19 end ;
Biến mng Truoc dùng để khôi phc đường đi.
8.4. Đường đi trên đồ th phi chu trình
S dng Thut toán 4.5 (Chương 4) để đánh s các đỉnh trên đồ th định
hướng phi chu trình, ta xây dng được thut toán ngn gn hơn để tìm khong cách
t đỉnh ngun ti tt c các đỉnh trong mt đồ th phi chu trình.
Thut toán 8.4:
D liu: Biu din mng DK_V các danh sách k ca đồ th định hướng phi chu
trình G = (V, E) vi tp đỉnh V = {v1, v2, ..., vn} đã được đánh s mà danh sách
DK_V[vj] cha các đỉnh nhn vjđỉnh k và ma trn trng s C ca đồ th G.
Kết qu: Mng D các s nguyên vi D[vi] cha khong cách d(v1,vi) , i = 2, 3, ..., n.
1 Begin
2 D[v1] := 0 ;
3 for j := 2 to n do D[vj] := ;
4 for j := 2 to n do
5 for vi DK_V[vj] do D[vj] := min( D[vj] , D[vi] + C[vi,vj]
6 End.
Tính đúng đắn ca thut toán suy t chi tiết sau đây: tt c các đỉnh trung
gian trên đường đi ngn nht t v1 ti vj có ch s nh hơn j. Mi cnh (vi,vj) được
xét trong dòng lnh 5 đúng mt ln, do vy độ phc tp ca thut toán là O(m).
Ta cũng có th áp dng thut toán trên để tìm đường đi dài nht t đỉnh
ngun ti các đỉnh khác ca đồ th hoc tìm đường đi dài nht trên đồ th định
hướng phi chu trình có trng s.
Ví d 8.4: Tìm đường đi dài nht trên đồ th định hướng phi chu trình có trng s
dưới đây.