[r]
(1)Lý thuy t đ ị
Tìm đường ng n nh t – Dijkstraắ ấ Nh c l iắ ạ
Thu t toán Dijkstra ch áp d ng đậ ỉ ụ ược cho đ th khơng có c nh âm Thu t tốn s b t đ uồ ị ậ ẽ ắ ầ
t đ nh xu t phát x k t thúc đ nh y đừ ỉ ấ ế ỉ ược xét (t i u) ố (Nh v y, v nguyên t cư ậ ề ắ
n u có th tìm đế ể ường ng n nh t t đ nh x đ n t t c đ nh đ th )ắ ấ ỉ ế ấ ả ỉ ồ ị
M ng arrnCost s l u chi phí t i u (hi n t i) t đ nh xu t phát đ n đ nh đ th ả ẽ ố ệ ỉ ấ ế ỉ ị
M t đ nh i độ ỉ ược xét xong (finalized) s có arrnCost[i] chi phí t i u.ẽ ố
N u mu n in đế ố ường ng n nh t, ta s ph i s d ng thêm m t m ng ph đ l u l iắ ấ ẽ ả ụ ộ ả ụ ể
đ nh trỉ ước (đ nh cha) Đỉ ường s đẽ ược t t đ nh y, đ n arrnPrevious[y], … đ nệ ỉ ế ế
khi g p đ nh x d ng.ặ ỉ
Tóm t t thu t tốnắ ậ
Có th hi u ng n g n r ng t p xét xong (V\T) s để ể ắ ọ ằ ậ ẽ ược m r ng d n, b t đ u đ nh x,ở ộ ầ ắ ầ ỉ
sau đ nh xỉ có chi phí t x đ n xừ ế bé nh t, r i đ n đ nh xấ ế ỉ có chi phí tích lũy từ
x ho c xặ bé nh t, r i đ n đ nh xấ ế ỉ 3… c nh v y cho đ n đ nh y thu c v t pứ ậ ế ỉ ộ ề ậ
đã xét xong (y ∈V\T hay y ∉ T)
Cũng gi ng nh thu t tốn tìm khung Prime, vi c tìm l i m t đố ậ ệ ộ ường ng n nh t t t pắ ấ ậ
đã xét xong V\T đ n t p ch a xét xong T s t n r t nhi u chi phí (c n vịng for), taế ậ ẽ ố ấ ề ầ
có th c i ti n b ng cách l u l i đ dài nh nh t đ n đ nh v ể ả ế ằ ộ ỏ ấ ế ỉ ∈ T ch c n vịng for đỉ ầ ể
tìm đ nh có đ dài Dỉ ộ ưới thu t toán Dijkstra:ậ
1 Kh i t o:ở
o Thu t toán đậ ược b t đ u v i gi thi t chi phí t đ nh xu t phát đ n t tắ ầ ả ế ỉ ấ ế ấ
c đ nh khác ∞ (có th s d ng tr đ c bi t -1), tr đ nh xu tả ỉ ể ụ ị ặ ệ ỉ ấ
phát x, có chi phí (dùng m ng ả int arrnCost[MAX]): arrnCost[i] = ∞, ∀i ≠ x; arrnCost[k] = 0
o Ngoài ra, ban đ u, t t c đ nh đ u thu c v t p ch a xét xong (ầ ấ ả ỉ ề ộ ề ậ not finalized yet) T (dùng m ng ả int T[MAX]):
T[i] = true (1), ∀i
o Đ có th l u l i để ể ường ng n nh t, ta c n s d ng thêm m t m ng (ắ ấ ầ ụ ộ ả int arrnPrevious[MAX])
2 N u đ nh y ế ỉ ∉ T, nghĩa y xét xong (finalized), arrnCost[y] chi phí t iố
u, ta d ng thu t tốn, in chi phí đ ng ng n nh t
ư ậ ườ ắ ấ
3 Ch n m t đ nh v ọ ộ ỉ ∈ T (ch a xét xong) có chi phí nh nh t (dùng m t vịng for).ư ỏ ấ ộ
N u khơng tìm đế ược m t v nh v y, nghĩa không th tìm độ ậ ể ược đường t xừ
đ n y (không liên thông) ế D ng thu t tốnừ ậ thơng báo khơng tìm đường Đánh d u v đấ ược xét xong (finalized): T := T\{v}
T[v] = false (0))
5 ∀k ∈ T, n u có c nh n i t v đ n k chi phí t i u h nế ố ế ố
arrnCost[k] == -1 (ch a xét)ư
ho c arrnCost[k] > arrnCost[v] + a[v, k]ặ (t i u h n)ố ư ơ
(2)Lý thuy t đ ị
thì ta s c p nh t l i chi phí t i uẽ ậ ậ ố
ho c arrnCost[k] > arrnCost[v] + a[v, k]ặ
6 Quay l i bạ ước
Dưới minh h a cho thu t toán Dijkstra v i đ nh xu t phát 1, đ nh k t thúc 2.ọ ậ ỉ ấ ỉ ế
ch n v = 1ọ
c p nh t giá tr cho đ nh đ nh 3ậ ậ ị ỉ ỉ
Lê Th y Anhụ 2/4
2 cost = 0
cost = ∞
cost = ∞
cost = ∞
2 cost = 0
previous = cost =
cost = ∞
cost = 5, previous =
2
cost =
previous =
cost = 2
cost = ∞
cost = 5, previous =
2
cost =
previous =
cost = 2
previous = cost =
cost = previous = C p nh tậ ậ
2
cost =
previous = cost =
previous = cost =
cost = 3
previous =
2
cost =
previous = cost =
previous = cost =
cost = 3
previous =
(3)Lý thuy t đ ị
Nh n xét r ng, thu t tốn ch khi, chi phí đ n đ nh xậ ằ ậ ỉ ế ỉ i ≤ chi phí đ
xj (vói j≤i) N u nh đ th có c nh âm, đế ị ường tìm có th s không t i u.ể ẽ ố
Xét ví d dụ ưới hình sau v i đ nh xu t phát 0, đ nh k t thúc 2:ớ ỉ ấ ỉ ế
B1: T = {0, 1, 2}, arrnCost[] = {0, ∞, ∞}, B2: v = ⇒ T = {1, 2}, arrnCost[] = {0, 3, 2} B3: v = ⇒ T = {1}, arrnCost[] = {0, 3, 2}
B4: ∉ T, d ng thu t tốn Chi phí ng n nh t tìm đừ ậ ắ ấ ược
Rõ ràng n u ta theo → → chi phí (3-2),ế
chi phí tìm khơng ph i chi phí ng n nh t.ả ắ ấ
Cài đ t – c u trúc d li uặ ấ ữ ệ Ta c n m ng sauầ ả
int T[MAX];
int arrnCost[MAX]; // dùng double n u ma tr n k s d ng doubleế ậ ề ụ int arrnPrevious[MAX];
Cài đ t – Hàm kh i t o InitDijkstraặ ở ạ void InitDijkstra()
{
// c p nh t chi phí cho đ nh vơ c c (-1),ậ ậ ỉ ự // t p T g m t t c đ nhậ ồ ấ ả ỉ
for (i…) {
… }
// riêng đ nh xu t phát có chi phí 0ỉ ấ arrnCost[nStartNode] = 0;
}
Cài đ t – Hàm Dijkstraặ void Dijkstra()
{
// d ng n u nh y ừ ế ư ∉ T while (…)
Lê Th y Anhụ 3/4
2
1
5
2
1
3
cost =
previous = cost =
previous =
cost = 5
cost = previous =
2
1
5
2
1
3
cost =
previous = cost =
previous =
cost = 5
cost = previous =
3
2
-2
0
(4)Lý thuy t đ ị
{
v = -1;
// tìm t p T, ch n đ nh có chi phí nh tậ ọ ỉ ấ for (i…)
if (… && (… || …))
// ch n đ nh i đ nh minọ ỉ ỉ …
// n u khơng có v nh th , d ng thu t tốn (khơng liên thơng)ế ư ế ừ ậ if (…)
break;
// lo i b v kh i Tạ ỏ ỏ …
// c p nh t đ dài đ nh k ậ ậ ộ ỉ ∈ T, n u có đế ường t v ừ → k // (arrnCost[k] ∞ ho c arrnCost[k] > arrnCost[v]+a[v][k]ặ for (k…)
if (… && … && (… || …)) …
} }
Hàm in đường – PrintResult
o N u nh y thu c T, nghĩa y v n ch a đế ộ ẫ ược xét xong, ta khơng tìm đường t x đ n y.ừ ế
o N u nh y không thu c T, arrnCost[y] chi phí t i u t x đ n y ế ộ ố ế
Khi dị theo y → y1=arrnParents[y] → y2=arrnParents[y1] → cho đ n ta g pế ặ
đ nh x.ỉ
void PrintResult() {
if (T[i])
printf(“Khong co duong di…”); else
{
printf(“Chi phi toi uu la…”); printf(“Duong di tim duoc…”); k = y;
printf(“%d”, k); while (k != x) {
k = arrnPrevious[k]; printf(“ < %d”, k); }
} }