Lý thuyết đồ thị - Tìm đường đi ngắn nhất với Dijkstra

4 18 0
Lý thuyết đồ thị - Tìm đường đi ngắn nhất với Dijkstra

Đang tải... (xem toàn văn)

Thông tin tài liệu

[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); }

} }

Ngày đăng: 09/03/2021, 05:01

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan