33
Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị Thuật toán Dijktra

Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Embed Size (px)

DESCRIPTION

Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị. Thuật toán Dijktra. Tìm đường đi ngắn nhất. Trong đồ thị không trọng số Tìm đường đi qua từ đỉnh i đến đỉnh j sao cho phải đi qua ít đỉnh trung gian nhất. 2. 2. 1. 1. 4. 4. 6. 3. 3. 5. 5. Tìm đường đi ngắn nhất. - PowerPoint PPT Presentation

Citation preview

Page 1: Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Thuật toán Dijktra

Page 2: Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Tìm đường đi ngắn nhất Trong đồ thị không trọng số

Tìm đường đi qua từ đỉnh i đến đỉnh j sao cho phải đi qua ít đỉnh trung gian nhất

1

2

3

4

5

1

2

3

4

5

6

Page 3: Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Tìm đường đi ngắn nhất Tìm đường đi ngắn nhất giữa hai đỉnh

trong đồ thị không trọng số Dùng thuật loang theo chiều rộng (BFS)

Page 4: Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Tìm đường đi ngắn nhất Trong đồ thị có trọng số trên mỗi cạnh

Tìm đường đi ngắn nhất từ đỉnh i đến j Tìm đường đi sao cho tổng trọng số trên

các cạnh thuộc đường đi là bé nhất

1

35

2

64

1 15

23

1

1

5

1

Page 5: Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Tìm đường đi ngắn nhất Trong đồ thị có trọng số :

Thuật giải vét cạn Thuật toán Dijktra

Page 6: Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Tìm đường đi ngắn nhất Thuật giải vét cạn

Tìm một đường đi từ đỉnh i đến đỉnh j Nếu độ dài của đường đi vừa tìm được

nhỏ hơn độ dài đường đi ngắn nhất hiện tại Gán đường đi ngắn nhất là đường đi vừa tìm

được Tiếp tục thực hiện bước đầu tiên đến khi

không còn đường đi nào khác từ i đến j

Page 7: Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Tìm đường đi ngắn nhất Thuật giải vét cạn

Đệ quy Dùng mảng stack để khử đệ quy

Page 8: Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Tìm đường đi ngắn nhất Thuật giải vét cạn

Đồ thị không có chu trình có trọng số âm

i a j

b c

t1 t2

t5 t3

t4

Đường đi : i – a – c – b – a – jĐộ dài : t1 + t3 + t4 + t5 + t2

Chu trình : a – b – cTrọng số : t3 + t4 + t5 ≥ 0

t1 + t3 + t4 + t5 + t2 ≥ t1 + t2

Đường đi i – a – c – b – a – jdài hơn đường đi i – a – j

Page 9: Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Tìm đường đi ngắn nhất Thuật giải vét cạn

Đồ thị không có chu trình có trọng số âm Đường đi ngắn nhất sẽ là một đường đi đơn

Page 10: Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Tìm đường đi ngắn nhất Thuật giải vét cạn

Đồ thị không có chu trình có trọng số âm Đồ thị có chứa chu trình có trọng số âm

1 2

34

51

-2

-1

1

2

• Đường đi : 1 – 2 – 5 • Đường đi : 1 – 2 – 3 – 4 – 2 – 5• Đường đi : 1 – 2 – 3 – 4 – 2 – 3 – 4 – 2 – 5• Đường đi : 1 – 2 – 3 – 4 – 2 – … – 2 – 5

Độ dài : 3Độ dài : 1Độ dài : -1Độ dài : -∞

Page 11: Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Tìm đường đi ngắn nhất Thuật giải vét cạn

Đồ thị không có chu trình có trọng số âm Đường đi ngắn nhất sẽ là một đường đi đơn

Đồ thị có chứa chu trình có trọng số âm Độ dài đường đi ngắn nhất giữa một số cặp

đỉnh sẽ không thể xác định

Chỉ xét những đồ thị không có chu trình có trọng số âmChỉ xét những đường đi đơn

Page 12: Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Tìm đường đi ngắn nhất Thuật giải vét cạn

1

53

2

64

1 15

2 3

1

1

5

1

• Gán độ dài đường đi ngắn nhất bằng ∞

• Tìm một đường đi trong đồ thị từ đỉnh 1 đến đỉnh 6

• Độ dài vừa tìm được bé hơn độ dài đường đi ngắn nhất hiện tại Gán đường đi ngắn nhất là đường đi vừa tìm được

• Lặp lại bước 2 đến khi không còn đường đi nào khác

Page 13: Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Tìm đường đi ngắn nhất Thuật giải vét cạn

1

53

2

64

1 15

2 3

1

1

5

1

• Gán độ dài đường đi ngắn nhất bằng ∞

• Tìm một đường đi trong đồ thị từ đỉnh 1 đến đỉnh 6

• Độ dài vừa tìm được bé hơn độ dài đường đi ngắn nhất hiện tại Gán đường đi ngắn nhất là đường đi vừa tìm được

• Lặp lại bước 2 đến khi không còn đường đi nào khác

MinLen = ∞ShortestPath = Ø

Page 14: Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Tìm đường đi ngắn nhất Thuật giải vét cạn

1

53

2

64

1 15

2 3

1

1

5

1

• Gán độ dài đường đi ngắn nhất bằng ∞

• Tìm một đường đi trong đồ thị từ đỉnh 1 đến đỉnh 6

• Độ dài vừa tìm được bé hơn độ dài đường đi ngắn nhất hiện tại Gán đường đi ngắn nhất là đường đi vừa tìm được

• Lặp lại bước 2 đến khi không còn đường đi nào khác

Len = 16Path = 1 – 2 – 6

MinLen = ∞ShortestPath = Ø

Page 15: Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Tìm đường đi ngắn nhất Thuật giải vét cạn

1

53

2

64

1 15

2 3

1

1

5

1

• Gán độ dài đường đi ngắn nhất bằng ∞

• Tìm một đường đi trong đồ thị từ đỉnh 1 đến đỉnh 6

• Độ dài vừa tìm được bé hơn độ dài đường đi ngắn nhất hiện tại Gán đường đi ngắn nhất là đường đi vừa tìm được

• Lặp lại bước 2 đến khi không còn đường đi nào khác

Len = 16Path = 1 – 2 – 6

MinLen = ∞ShortestPath = Ø

Len < MinLen

Page 16: Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Tìm đường đi ngắn nhất Thuật giải vét cạn

1

53

2

64

1 15

2 3

1

1

5

1

• Gán độ dài đường đi ngắn nhất bằng ∞

• Tìm một đường đi trong đồ thị từ đỉnh 1 đến đỉnh 6

• Độ dài vừa tìm được bé hơn độ dài đường đi ngắn nhất hiện tại Gán đường đi ngắn nhất là đường đi vừa tìm được

• Lặp lại bước 2 đến khi không còn đường đi nào khác

Len = 16Path = 1 – 2 – 6

MinLen = 16ShortestPath = 1 - 2 - 6

Page 17: Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Tìm đường đi ngắn nhất Thuật giải vét cạn

1

53

2

64

1 15

2 3

1

1

5

1

• Gán độ dài đường đi ngắn nhất bằng ∞

• Tìm một đường đi trong đồ thị từ đỉnh 1 đến đỉnh 6

• Độ dài vừa tìm được bé hơn độ dài đường đi ngắn nhất hiện tại Gán đường đi ngắn nhất là đường đi vừa tìm được

• Lặp lại bước 2 đến khi không còn đường đi nào khác

Len = 16Path = 1 – 2 – 6

MinLen = 16ShortestPath = 1 – 2 – 6

Page 18: Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Tìm đường đi ngắn nhất Thuật giải vét cạn

1

53

2

64

1 15

2 3

1

1

5

1

• Gán độ dài đường đi ngắn nhất bằng ∞

• Tìm một đường đi trong đồ thị từ đỉnh 1 đến đỉnh 6

• Độ dài vừa tìm được bé hơn độ dài đường đi ngắn nhất hiện tại Gán đường đi ngắn nhất là đường đi vừa tìm được

• Lặp lại bước 2 đến khi không còn đường đi nào khác

Len = 7Path = 1 – 2 – 4 – 6

MinLen = 16ShortestPath = 1 – 2 – 6

Page 19: Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Tìm đường đi ngắn nhất Thuật giải vét cạn

1

53

2

64

1 15

2 3

1

1

5

1

• Gán độ dài đường đi ngắn nhất bằng ∞

• Tìm một đường đi trong đồ thị từ đỉnh 1 đến đỉnh 6

• Độ dài vừa tìm được bé hơn độ dài đường đi ngắn nhất hiện tại Gán đường đi ngắn nhất là đường đi vừa tìm được

• Lặp lại bước 2 đến khi không còn đường đi nào khác

Len = 7Path = 1 – 2 – 4 – 6

MinLen = 16ShortestPath = 1 – 2 – 6

Len < MinLen

Page 20: Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Tìm đường đi ngắn nhất Thuật giải vét cạn

1

53

2

64

1 15

2 3

1

1

5

1

• Gán độ dài đường đi ngắn nhất bằng ∞

• Tìm một đường đi trong đồ thị từ đỉnh 1 đến đỉnh 6

• Độ dài vừa tìm được bé hơn độ dài đường đi ngắn nhất hiện tại Gán đường đi ngắn nhất là đường đi vừa tìm được

• Lặp lại bước 2 đến khi không còn đường đi nào khác

Len = 7Path = 1 – 2 – 4 – 6

MinLen = 7ShortestPath = 1 – 2 – 4 – 6

Page 21: Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Tìm đường đi ngắn nhất Thuật giải vét cạn

1

53

2

64

1 15

2 3

1

1

5

1

• Gán độ dài đường đi ngắn nhất bằng ∞

• Tìm một đường đi trong đồ thị từ đỉnh 1 đến đỉnh 6

• Độ dài vừa tìm được bé hơn độ dài đường đi ngắn nhất hiện tại Gán đường đi ngắn nhất là đường đi vừa tìm được

• Lặp lại bước 2 đến khi không còn đường đi nào khác

Len = 7Path = 1 – 2 – 4 – 6

MinLen = 7ShortestPath = 1 – 2 – 4 – 6

Page 22: Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Tìm đường đi ngắn nhất Thuật giải vét cạn

1

53

2

64

1 15

2 3

1

1

5

1

• Gán độ dài đường đi ngắn nhất bằng ∞

• Tìm một đường đi trong đồ thị từ đỉnh 1 đến đỉnh 6

• Độ dài vừa tìm được bé hơn độ dài đường đi ngắn nhất hiện tại Gán đường đi ngắn nhất là đường đi vừa tìm được

• Lặp lại bước 2 đến khi không còn đường đi nào khác

Len = 4Path = 1 – 5 – 3 – 4 – 6

MinLen = 7ShortestPath = 1 – 2 – 4 – 6

Page 23: Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Tìm đường đi ngắn nhất Thuật giải vét cạn

1

53

2

64

1 15

2 3

1

1

5

1

• Gán độ dài đường đi ngắn nhất bằng ∞

• Tìm một đường đi trong đồ thị từ đỉnh 1 đến đỉnh 6

• Độ dài vừa tìm được bé hơn độ dài đường đi ngắn nhất hiện tại Gán đường đi ngắn nhất là đường đi vừa tìm được

• Lặp lại bước 2 đến khi không còn đường đi nào khác

Len = 4Path = 1 – 5 – 3 – 4 – 6

MinLen = 7ShortestPath = 1 – 2 – 4 – 6

Len < MinLen

Page 24: Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Tìm đường đi ngắn nhất Thuật giải vét cạn

1

53

2

64

1 15

2 3

1

1

5

1

• Gán độ dài đường đi ngắn nhất bằng ∞

• Tìm một đường đi trong đồ thị từ đỉnh 1 đến đỉnh 6

• Độ dài vừa tìm được bé hơn độ dài đường đi ngắn nhất hiện tại Gán đường đi ngắn nhất là đường đi vừa tìm được

• Lặp lại bước 2 đến khi không còn đường đi nào khác

Len = 4Path = 1 – 5 – 3 – 4 – 6

MinLen = 4ShortestPath = 1 – 5 – 3 – 4 – 6

Page 25: Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Tìm đường đi ngắn nhất Thuật giải vét cạn

1

53

2

64

1 15

2 3

1

1

5

1

• Gán độ dài đường đi ngắn nhất bằng ∞

• Tìm một đường đi trong đồ thị từ đỉnh 1 đến đỉnh 6

• Độ dài vừa tìm được bé hơn độ dài đường đi ngắn nhất hiện tại Gán đường đi ngắn nhất là đường đi vừa tìm được

• Lặp lại bước 2 đến khi không còn đường đi nào khác

Len = 4Path = 1 – 5 – 3 – 4 – 6

MinLen = 4ShortestPath = 1 – 5 – 3 – 4 – 6

Page 26: Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Tìm đường đi ngắn nhất Thuật giải vét cạn

1

53

2

64

1 15

2 3

1

1

5

1

• Gán độ dài đường đi ngắn nhất bằng ∞

• Tìm một đường đi trong đồ thị từ đỉnh 1 đến đỉnh 6

• Độ dài vừa tìm được bé hơn độ dài đường đi ngắn nhất hiện tại Gán đường đi ngắn nhất là đường đi vừa tìm được

• Lặp lại bước 2 đến khi không còn đường đi nào khác

Len = 25Path = 1 – 5 – 4 – 2 – 6

MinLen = 4ShortestPath = 1 – 5 – 3 – 4 – 6

Page 27: Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Tìm đường đi ngắn nhất Thuật giải vét cạn

1

53

2

64

1 15

2 3

1

1

5

1

• Gán độ dài đường đi ngắn nhất bằng ∞

• Tìm một đường đi trong đồ thị từ đỉnh 1 đến đỉnh 6

• Độ dài vừa tìm được bé hơn độ dài đường đi ngắn nhất hiện tại Gán đường đi ngắn nhất là đường đi vừa tìm được

• Lặp lại bước 2 đến khi không còn đường đi nào khác

Len = 25Path = 1 – 5 – 4 – 2 – 6

MinLen = 4ShortestPath = 1 – 5 – 3 – 4 – 6

Len > MinLen

Page 28: Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Tìm đường đi ngắn nhất Thuật giải vét cạn

1

53

2

64

1 15

2 3

1

1

5

1

• Gán độ dài đường đi ngắn nhất bằng ∞

• Tìm một đường đi trong đồ thị từ đỉnh 1 đến đỉnh 6

• Độ dài vừa tìm được bé hơn độ dài đường đi ngắn nhất hiện tại Gán đường đi ngắn nhất là đường đi vừa tìm được

• Lặp lại bước 2 đến khi không còn đường đi nào khác

Len = 25Path = 1 – 5 – 4 – 2 – 6

MinLen = 4ShortestPath = 1 – 5 – 3 – 4 – 6

Page 29: Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Tìm đường đi ngắn nhất Thuật giải vét cạn

1

53

2

64

1 15

2 3

1

1

5

1

• Gán độ dài đường đi ngắn nhất bằng ∞

• Tìm một đường đi trong đồ thị từ đỉnh 1 đến đỉnh 6

• Độ dài vừa tìm được bé hơn độ dài đường đi ngắn nhất hiện tại Gán đường đi ngắn nhất là đường đi vừa tìm được

• Lặp lại bước 2 đến khi không còn đường đi nào khác

Len = 6Path = 1 – 5 – 4 – 6

MinLen = 4ShortestPath = 1 – 5 – 3 – 4 – 6

Page 30: Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Tìm đường đi ngắn nhất Thuật giải vét cạn

1

53

2

64

1 15

2 3

1

1

5

1

• Gán độ dài đường đi ngắn nhất bằng ∞

• Tìm một đường đi trong đồ thị từ đỉnh 1 đến đỉnh 6

• Độ dài vừa tìm được bé hơn độ dài đường đi ngắn nhất hiện tại Gán đường đi ngắn nhất là đường đi vừa tìm được

• Lặp lại bước 2 đến khi không còn đường đi nào khác

Len = 6Path = 1 – 5 – 4 – 6

MinLen = 4ShortestPath = 1 – 5 – 3 – 4 – 6

Len > MinLen

Page 31: Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Tìm đường đi ngắn nhất Thuật giải vét cạn

1

53

2

64

1 15

2 3

1

1

5

1

• Gán độ dài đường đi ngắn nhất bằng ∞

• Tìm một đường đi trong đồ thị từ đỉnh 1 đến đỉnh 6

• Độ dài vừa tìm được bé hơn độ dài đường đi ngắn nhất hiện tại Gán đường đi ngắn nhất là đường đi vừa tìm được

• Lặp lại bước 2 đến khi không còn đường đi nào khác

Len = 6Path = 1 – 5 – 4 – 6

MinLen = 4ShortestPath = 1 – 5 – 3 – 4 – 6

Page 32: Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Tìm đường đi ngắn nhất Thuật giải vét cạn

1

53

2

64

1 15

2 3

1

1

5

1

• Gán độ dài đường đi ngắn nhất bằng ∞

• Tìm một đường đi trong đồ thị từ đỉnh 1 đến đỉnh 6

• Độ dài vừa tìm được bé hơn độ dài đường đi ngắn nhất hiện tại Gán đường đi ngắn nhất là đường đi vừa tìm được

• Lặp lại bước 2 đến khi không còn đường đi nào khác

MinLen = 4ShortestPath = 1 – 5 – 3 – 4 – 6

Không còn đường đi khác từ đỉnh 1 đến đỉnh 6

Page 33: Tìm đường đi ngắn nhất giữa hai đỉnh của đồ thị

Tìm đường đi ngắn nhất Thuật giải vét cạn

1

53

2

64

1 15

2 3

1

1

5

1

• Gán độ dài đường đi ngắn nhất bằng ∞

• Tìm một đường đi trong đồ thị từ đỉnh 1 đến đỉnh 6

• Độ dài vừa tìm được bé hơn độ dài đường đi ngắn nhất hiện tại Gán đường đi ngắn nhất là đường đi vừa tìm được

• Lặp lại bước 2 đến khi không còn đường đi nào khác

MinLen = 4ShortestPath = 1 – 5 – 3 – 4 – 6