You are on page 1of 32

Nội dung

CHƯƠNG 5 1. ĐƯỜNG ĐI TRÊN ĐỒ THỊ TỔNG QUÁT


CÁC BÀI TOÁN ĐƯỜNG ĐI
2. ĐƯỜNG ĐI TRÊN ĐỒ THỊ CÓ TRỌNG SỐ

Bùi Tiến Lên


3. MỘT SỐ KHÁI NIỆM LIÊN QUAN ĐẾN ĐƯỜNG ĐI
Đại học Khoa học Tự nhiên TPHCM

1/1/2021 4. ĐƯỜNG ĐI CÓ RÀNG BUỘC

5. ĐƯỜNG ĐI TRÊN ĐỒ THỊ DAG

Spring 2021 Graph Theory 2

Đường đi là gì
ĐƯỜNG ĐI TRÊN ĐỒ THỊ TỔNG QUÁT
Định nghĩa 5.1
Cho đồ thị G = (V , E ), đường đi (path) P trong G là một dãy
luân phiên các ”đỉnh - cạnh”

P = v1 e1 v2 e2 v3 ...vm

sao cho ei = (vi , vi+1 ) hoặc

P = v1 v2 v3 ...vm

Các loại đường đi


I Đường đi sơ cấp là đường đi không có đỉnh lặp lại
I Đường đi đơn là đường đi không có cạnh lặp lại
I Đường đi tổng quát không ràng buộc

Spring 2021 Graph Theory 4


Các bài toán đường đi Các bài toán chu trình

Bài toán 5.1 Bài toán 5.2


I Bài toán tìm một đường đi sơ cấp: Cho đồ thị G = (V , E ) I Bài toán tìm chu trình sơ cấp: Cho đồ thị G = (V , E ) và
và hai đỉnh s và t. Hãy tìm đường đi sơ cấp đi từ s cho đến t hai s. Hãy tìm chu trình sơ cấp đi qua s.
I Bài toán tìm tất cả đường đi sơ cấp: Cho đồ thị I Bài toán tìm tất cả chu trình sơ cấp: Cho đồ thị
G = (V , E ) và hai đỉnh s và t. Hãy tìm tất cả đường đi sơ G = (V , E ) và hai s. Hãy tìm tất cả chu trình sơ cấp đi qua
cấp từ s cho đến t s.
I Bài toán tìm tất cả đường đi đơn: Cho đồ thị G = (V , E )
và hai đỉnh s và t. Hãy tìm đường đi đơn từ s cho đến t
I Bài toán tìm một đường đi có chiều dài cho trước: Cho
đồ thị G = (V , E ) và hai đỉnh s và t và một số dương k. Hãy
tìm đường đi có chiều dài k đi từ s cho đến t

Spring 2021 Graph Theory 5 Spring 2021 Graph Theory 6

Cây đường đi sơ cấp Cây đường đi sơ cấp (cont.)

A
Định nghĩa 5.2
F
Cho đồ thị G = (V , E ) và đỉnh s, cây đường đi sơ cấp bắt đầu từ D B C D
đỉnh s sẽ liệt kê tất cả đường đi sơ cấp từ s tới các đỉnh của đồ thị C
K A G I E F C F
E
B G G K K E F K
G
I G K K
(a) đồ thị (b) cây đường đi bắt đầu từ đỉnh A

Hình 5.1: Đồ thị và cây đường đi

Spring 2021 Graph Theory 7 Spring 2021 Graph Theory 8


Cây đường đi sơ cấp (cont.) Cây đường đi sơ cấp (cont.)

A A

F F
D B C D D B C D
C C
K A K A
G I E F C F G I E F C F
E E
B G G K K E F K B G G K K E F K
G G
I G K K I G K K
(a) đường đi trên đồ thị (b) đường đi trên cây đường đi (a) đường đi trên đồ thị (b) đường đi trên cây đường đi

Hình 5.2: Đường đi từ A đến G Hình 5.3: Đường đi từ A đến G

Spring 2021 Graph Theory 9 Spring 2021 Graph Theory 10

Cây đường đi sơ cấp (cont.) Cây đường đi sơ cấp (cont.)

A A

F F
D B C D D B C D
C C
K A G I E F C F K A G I E F C F
E E
B G G K K E F K B G G K K E F K
G G
I G K K I G K K
(a) đường đi trên đồ thị (b) đường đi trên cây đường đi (a) đường đi trên đồ thị (b) đường đi trên cây đường đi
Hình 5.4: Đường đi từ A đến G Hình 5.5: Đường đi từ A đến G

Spring 2021 Graph Theory 11 Spring 2021 Graph Theory 12


Bài tập minh họa Bài tập minh họa (cont.)

f
f g
g
a
a
e
e d
d

b
b c
c
Hình 5.7: Hãy vẽ cây đường đi sơ cấp cho đồ thị vô hướng trên bắt đầu
Hình 5.6: Hãy vẽ cây đường đi sơ cấp cho đồ thị có hướng trên bắt đầu từ đỉnh a
từ đỉnh a

Spring 2021 Graph Theory 13 Spring 2021 Graph Theory 14

DFS tìm đường đi sơ cấp DFS tìm đường đi sơ cấp (cont.)

I Trong hàm trên đã sử dụng kỹ thuật lưu vết của đường đi


Algorithm 1 Tìm đường đi P từ đỉnh vs đến ve thông qua việc lưu lại đỉnh trước của đỉnh v bằng phép gán
1: function dfs_find_path(vs ,ve ) pre [v] = vs
2: Duyệt vs I Để xác định đường đi ta sử dụng cách lần ngược từ đỉnh ve
3: if vs == ve then cho đến vs
4: return true pre pre pre pre
vs v1 ... vk ve
5: for mỗi đỉnh v kề với đỉnh vs do
6: if v chưa được duyệt then
7: pre [v] = vs
8: if dfs_find_path(v,ve ) then
9: return true
10: return false

Spring 2021 Graph Theory 15 Spring 2021 Graph Theory 16


DFS tìm tất cả đường đi sơ cấp BFS tìm đường đi sơ cấp

Algorithm 2 Tìm tất cả đường đi từ đỉnh vs đến ve Algorithm 3 Tìm đường đi từ đỉnh vs đến ve
1: procedure dfs_find_all_paths(vs ,ve ) procedure bfs_find_path(vs ,ve )
2: Duyệt vs queue ← vs
3: if vs == ve then while queue 6= ∅ do
4: In ra đường đi v ← queue
5: for mỗi đỉnh v kề với đỉnh vs do Duyệt đỉnh v
6: if v chưa được duyệt then if v == ve then
7: push(pre[v]) In ra đường và kết thúc
8: pre [v] = vs for mỗi đỉnh u kề với đỉnh v do
9: dfs_find_all_paths(v,ve ) if đỉnh u chưa duyệt và không có trong queue then
10: pop(pre[v]) pre [u] = v
11: vs trở lại trạng thái chưa duyệt queue ← u

Spring 2021 Graph Theory 17 Spring 2021 Graph Theory 18

Đồ thị đường đi tổng quát


ĐƯỜNG ĐI TRÊN ĐỒ THỊ CÓ TRỌNG
I Đồ thị đường đi tổng quát nhằm mục đích biểu diễn các SỐ
đường đi không phải sơ cấp hay đơn

d e e e e e e

a d d d d d d
e
c
c c c c c c
b

Hình 5.8: Đồ thị b b b b b b

a a a a a a

Hình 5.9: Đồ thị đường đi a-b-c-a-d-e

Spring 2021 Graph Theory 19


Bài toán tìm đường đi Bài toán đường đi ngắn nhất

Đối với đồ thị có trọng số, thường xét đến Bài toán 5.3
I Tìm đường đi ngắn nhất
Cho đồ thị G = (V , E , L) là một đồ thị có trọng số, hai đỉnh s và
I Tìm đường đi dài nhất t, tập hợp P là tất cả các đường đi từ s đến t. Bài toán tìm
I Tìm đường đi thỏa mãn những yêu cầu nào đó đường đi ngắn nhất (shortest path) từ s đến t có thể phát biểu
qua công thức sau
Pmin = arg min(P) (5.1)
P∈P

Spring 2021 Graph Theory 21 Spring 2021 Graph Theory 22

Bài toán đường đi ngắn nhất (cont.) Nguyên lý Bellman

Một số lưu ý Nguyên lý


I Các thuật toán tìm đường đi ngắn nhất trên đồ thị là các I P là đường đi từ đỉnh s đến đỉnh t
thuật toán tối ưu rời rạc
I P1 và P2 , đường đi con của P từ đỉnh s đến k và từ k đến t
I Các thuật toán nói chung đều có thể áp dụng cho cả đồ thị
với k là một đỉnh nằm trên đường đi P
có hướng và vô hướng
Nếu P là đường đi ngắn nhất thì P1 và P2 cũng là những đường
I Khi giải bài toán đường đi ngắn nhất
đi ngắn nhất.
I Bỏ đi các cạnh song song và chỉ giữ lại cạnh có trọng số
nhỏ nhất P1 P2
I Bỏ đi các cạnh khuyên và chỉ giữ lại cạnh khuyên có s k t
trọng số âm bé nhất Hình 5.10: Nguyên lý Bellman

Spring 2021 Graph Theory 23 Spring 2021 Graph Theory 24


Nguyên lý Bellman (cont.) Nguyên lý Bellman (cont.)

Chứng minh Lưu ý


I Giả sử tồn tại một đường đi P10 từ s đến k ngắn hơn đường đi I Nguyên lý Bellman không có phát biểu ngược lại
P1 . Nghĩa là I Các đường đi P, P1 , P2 là những đường đi bất kỳ
L(P10 ) < L(P1 )
I Suy ra
L(P10 ⊕ P2 ) < L(P1 ⊕ P2 ) = L(P)
I Trái với giả thiết P là con đường ngắn nhất để đi từ s cho
đến t

Spring 2021 Graph Theory 25 Spring 2021 Graph Theory 26

Các thuật toán tìm đường đi ngắn nhất Thuật toán cây đường đi ngắn nhất

I Thuật toán cây đường đi ngắn nhất Cho đồ thị có trọng số không âm G = (V , E , L) với n đỉnh. Hãy
I Thuật toán Dijkstra xây dựng cây đường đi sơ cấp ngắn nhất T = (V , E , D) bắt đầu
từ đỉnh s đến các đỉnh trong đồ thị
I Thuật toán A*
I Thuật toán Bellman Algorithm 4 Thuật toán cây đường đi ngắn nhất
I Thuật toán Floyd I Bước 1: Khởi tạo VT = {s}, ET = ∅, d(s) = 0
I Bước 2: Chọn đỉnh y, y ∈ VG − VT sao cho
d(x) + l(x, y), x ∈ XT nhỏ nhất

VT = VT + {y}
ET = ET + {(x, y)}
d (y) = d (x) + l(x, y)

I Bước 3: Nếu không tìm được đỉnh y nào thì DỪNG ngược lại
quay lại bước 2

Spring 2021 Graph Theory 27 Spring 2021 Graph Theory 28


Minh họa thuật toán Minh họa thuật toán (cont.)

f
Áp dụng thuật toán cây đường đi ngắn nhất để tìm đường đi ngắn 12 g
từ đỉnh a đến các đỉnh còn lại 6
17 a d=0
4
f 12
2
g 3
6 e
8
17 a d 9
4
2
3 5 4
e 1
8 b
d 9 8
c
5 4
1 Hình 5.12: Đỉnh đầu tiên a
b
c 8

Hình 5.11: Tìm các đường đi ngắn nhất từ đỉnh a đến các đỉnh còn lại

Spring 2021 Graph Theory 29 Spring 2021 Graph Theory 30

Minh họa thuật toán (cont.) Minh họa thuật toán (cont.)

f 12 f 12
g g
6 6
17 a d=0 17 a d=0
4 4
2 2
3 3
e e
8 8
d d=3 9 d d=3 9
5 4 5 4
1 1
b b
c 8 c d=4 8

Hình 5.13: Thêm đỉnh d và cạnh ad Hình 5.14: Thêm đỉnh c và cạnh dc

Spring 2021 Graph Theory 31 Spring 2021 Graph Theory 32


Minh họa thuật toán (cont.) Minh họa thuật toán (cont.)

f 12 f 12
g d=6 g d=6
6 6
17 a d=0 17 a d=0
4 4
2 2
3 3
e e
8 8
d d=3 9 d d=3 9
5 4 5 4
1 1
b b d=7
c d=4 8 c d=4 8

Hình 5.15: Thêm đỉnh g và cạnh ag Hình 5.16: Thêm đỉnh d và cạnh db

Spring 2021 Graph Theory 33 Spring 2021 Graph Theory 34

Minh họa thuật toán (cont.) Minh họa thuật toán (cont.)

f 12 f d=2612
g d=6 g d=6
6 6
17 a d=0 17
4 4 a d=0
2 2
3 3
e d=9 e d=9
8 8
d d=3 9 d d=3 9
5 4 5
1 4
1
b d=7 b d=7
c d=4 8 8
c d=4
Hình 5.17: Thêm đỉnh e và cạnh ce Hình 5.18: Thêm đỉnh f và cạnh ef

Spring 2021 Graph Theory 35 Spring 2021 Graph Theory 36


Minh họa thuật toán (cont.) Thuật toán Dijkstra

Cho đồ thị có trọng số không âm G = (V , E , L) với n đỉnh. Hãy


Vậy đường đi ngắn nhất tìm đường đi sơ cấp ngắn nhất từ đỉnh s đến các đỉnh
f d=26
12 g d=6 I Từ a đến d: a d với trọng số 3
17
6
a d=0
Algorithm 5 Thuật toán Dijkstra
4 2 I Từ a đến c: a d c với trọng số 4
e d=98 3 I bước 1: d(s) ← 0 và d(x) ← ∞, ∀x 6= s
I Từ a đến g: a g với trọng số 6
d d=3 9 I bước 2: T ← ∅
5 4 I Từ a đến b: a d b với trọng số 7
1
b d=7 I bước 3: Lặp nếu còn đỉnh
c d=4 8 I Từ a đến e: a d c e với trọng số 9
I Chọn đỉnh y, y ∈
/ T sao cho d(y) nhỏ nhất
I Từ a đến f: a d c e f với trọng số
Hình 5.19: Cây đường đi I Cập nhật T : T ← T + {y}
26 I Cập nhật các giá trị d cho các đỉnh còn lại
ngắn nhất từ đỉnh a

/ T , d(x) > d(y) + l(y, x) ⇒ d(x) ← d(y) + l(y, x)


∀x ∈

Spring 2021 Graph Theory 37 Spring 2021 Graph Theory 38

Minh họa thuật toán Dijkstra Minh họa thuật toán Dijkstra

Áp dụng thuật toán Dijkstra để tìm đường đi ngắn từ đỉnh a đến


các đỉnh còn lại
Bảng 5.1: Bảng tính trọng số đường đi từ 1 đến Hình 5.21: Đồ thị và
f 12 các đỉnh các đỉnh được chọn
g
6
17 a d(a) d(b) d(c) d(d) d(e) d(f) d(g)
4 f 12
2 g
3 0 ∞ ∞ ∞ ∞ ∞ ∞ 6
e 17 4 a
8 9 ∞ 3 ∞ ∞ 6 2
d 9 3
7 4 11 ∞ 6 e 8 d 9
5
1
4 7 9 ∞ 6 5 4
1
b 7 9 ∞ b
8 c 8
c 9 ∞
Hình 5.20: Tìm các đường đi ngắn nhất từ đỉnh a đến các đỉnh còn lại
26

Spring 2021 Graph Theory 39 Spring 2021 Graph Theory 40


Thuật toán Dijkstra cập nhật Minh họa thuật toán Dijkstra cập nhật

Để xác định đường đi ta cần một biến prev(x) để lưu lại thông tin
đỉnh trước của đỉnh x trong đường đi Bảng 5.2: Bảng xác định trọng số & đỉnh trước trong đường đi

Algorithm 6 Thuật toán Dijkstra cập nhật a b c d e f g


I bước 1: d(s) ← 0, d(x) ← ∞, ∀x 6= s và prev(x) ← ∞, ∀x (0;null) (∞;null) (∞;null) (∞;null) (∞;null) (∞;null) (∞;null)
(9;a) (∞;null) (3;a) (∞;null) (∞;null) (6;a)
I bước 2: T ← ∅ (7;d) (4;d) (11;d) (∞;null) (6;a)
I bước 3: Lặp nếu còn đỉnh (7;d) (9;c) (∞;null) (6;a)
(7;d) (9;c) (∞;null)
I Chọn đỉnh y, y ∈ / T sao cho d(y) nhỏ nhất (9;c) (∞;null)
I Cập nhật T : T ← T + {y} (26;e)
I Cập nhật các giá trị d và prev cho các đỉnh còn lại

d (x) ← d (y) + l (y, x)



∀x ∈/ T , d (x) > d (y)+l (y, x) ⇒
prev (x) ← y

Spring 2021 Graph Theory 41 Spring 2021 Graph Theory 42

Cài đặt Dijkstra bằng hàng đợi ưu tiên Cài đặt Dijkstra bằng hàng đợi ưu tiên (cont.)

Algorithm 7 Thuật toán Dijsktra


Vấn đề
1: procedure dijkstra_find_path(vs ,ve )
I Trong thực tế, đồ thị có số đỉnh rất lớn 2: priority_queue ← vs (với vs .d = 0 và vs .prev = null)
I Do đó thuật toán Dijkstra nên được cài đặt bằng hàng đợi ưu 3: while priority_queue 6= ∅ do
tiên 4: v ← priority_queue
5: Duyệt đỉnh v
Định nghĩa 5.3 6: if v = ve then
Hàng đợi ưu tiên (priority queue) là một hàng đợi trong đó mỗi 7: In ra đường và kết thúc
phần tử được gắn với một con số được gọi là độ ưu tiên 8: for mỗi đỉnh u kề với đỉnh v do
I Độ ưu tiên sẽ do ứng dụng xác định 9: if đỉnh u chưa duyệt then
I Việc lấy một phần tử ra khỏi hàng đợi sẽ được dựa trên độ ưu 10: if u ∈ priority_queue then
11: cập nhật u.d và u.pre nếu tốt hơn
tiên và quy tắc FIFO. Nghĩa là phần tử nào có độ ưu tiên cao
12: else
nhất sẽ được lấy ra trước nhất. Trong trường hợp có nhiều
13: u.pre ← v và u.d ← v.d + l(v, u)
phần tử có cùng độ ưu tiên thì sử dụng quy tắc FIFO
14: priority_queue ← u

Spring 2021 Graph Theory 43 Spring 2021 Graph Theory 44


Minh họa Tìm tất cả đường đi ngắn nhất

I Hiệu chỉnh thuật toán Dijkstra để tìm tất cả đường đi ngắn


nhất từ vs đến ve . Thay vì chỉ lưu lại một đỉnh trước pre của
Hình 5.22: Tìm đường đi Bảng 5.3: Bảng tính cho thuật toán
bắt đầu từ đỉnh a đến các Dijkstra sử dụng hàng đợi ưu tiên. Mỗi v, ta sẽ lưu lại một danh sách đỉnh trước pre_list của v.
đỉnh còn lại đỉnh sẽ có hai thuộc tính d độ dài tính từ
đỉnh xuất phát (dùng làm độ ưu tiên) và
f 12 g pre đỉnh trước của đỉnh này
6
17 4 a v priority_queue
2
e 3 a(0;null)
8 d 9 a(0;null) b(9;a) d(3;a) g(6;a)
5 1 4 d(3;a) b(7;d) g(6;a) c(4;d) e(11;d)
8 b c(4;d) b(7;d) g(6;a) e(9;c)
c
g(6;a) b(7;d) e(9;c)
b(7;d) e(9;c)
e(9;c) f(26;e)
f(26;e) ∅

Spring 2021 Graph Theory 45 Spring 2021 Graph Theory 46

Tìm tất cả đường đi ngắn nhất (cont.) Ví dụ minh họa

Algorithm 8 Tìm tất cả đường đi ngắn nhất


Ví dụ 5.1
1: procedure DijkstraFindAllPath(vs ,ve )
2: priority_queue ← vs (với vs .d ← 0 và vs .prev_list ← null) Tìm tất cả đường đi ngắn nhất từ đỉnh a đến đỉnh i trên đồ thị vô
3: while priority_queue 6= ∅ do
4: v ← priority_queue
hướng dưới
5: Duyệt đỉnh v
6: if v = ve then
7: In ra đường và kết thúc e 6 i
8: for mỗi đỉnh u kề với đỉnh v do 6
9: if đỉnh u chưa duyệt then c 3
10: if u ∈ priority_queue then 4
2
11: if u.d > v.d + l(v, u) then 6 2 f
12: u.d ← v.d + l(v, u) 5
13: u.pre_list ← v a d
14: if u.d = v.d + l(v, u) then
h
3
15: Add(u.pre_list,v) 5 3
4 3
16: else b
17: u.pre_list ← v và u.d ← v.d + l(v, u) 7
g
18: priority_queue ← u

Spring 2021 Graph Theory 47 Spring 2021 Graph Theory 48


Thuật toán Dijkstra và đồ thị có trọng số âm Thuật toán A*

Thuật toán Dijkstra áp dụng cho đồ thị có trọng số âm


Vấn đề
I Thuật toán Dijkstra là một thuật toán vét cạn. Do đó, sẽ gặp
a a a rất nhiều khó khăn trong các bài toán có độ phức tạp lớn.

5 4 5 4 5 4

b -2 c b -2 c b -2 c
Hình 5.23: đồ thị có
Hình 5.24: đường đi Hình 5.25: đường đi
trọng số âm
ngắn nhất từ a - c theo ngắn nhất từ a - c thật
Dijkstra sự

Hình 5.26: Bài toán với đồ thị phức tạp

Spring 2021 Graph Theory 49 Spring 2021 Graph Theory 50

Thuật toán A* (cont.) Thuật toán A* (cont.)

Ý tưởng thuật toán A*


I Được Peter Hart, Nils Nilsson, và Bertram Raphael đề xuất
vào năm 1968
I Là sự cải tiến đột phá từ thuật toán Dijkstra bằng cách mỗi
đỉnh có thêm thông tin ước lượng h cho các đỉnh là khoảng a a
cách từ nó đến đỉnh kết thúc z z
I Độ ưu tiên trong hàng đợi sẽ được tính dựa trên d và h.
Thông thường là
d +h (5.2)

Hình 5.27: Tìm theo mọi hướng vs tìm với định hướng

Spring 2021 Graph Theory 51 Spring 2021 Graph Theory 52


Minh họa thuật toán A* Minh họa thuật toán A*

O
Ordea
71
Neamt Z N
Zerind 87
75 151 I
Iasis
Arad A
140 92
Sibiu Fagaras 118 S 99
Vaslui F V
80
Timisoara Rimnicu Vilcea T R
Lugoj 111 142
97 211
Pitesti L
Urziceni Hirsova P
Mehadia 70
146 101 U 98 H
Bucharest M 85
138 B 86
Dobreta 75
Craiova Eforie
D 120 90 E
Giurgiu C
G

Hình 5.28: Các thành phố của Romania Hình 5.29: Bản đồ đường bộ

Spring 2021 Graph Theory 53 Spring 2021 Graph Theory 54

Minh họa thuật toán A* Minh họa thuật toán A*

Bảng 5.4: Khoảng cách theo đường chim bay từ các thành phố đến O 380
thành phố Bucharest
Z 374 N 234
thành phố h thành phố h I 266
Arad 366 Mehadia 241 A 366
Bucharest 0 Neamt 234 S 253
Craiova 160 Oradea 380 F 176 V 199
Dobreta 242 Pitesti 100 T 329 R 193
Eforie 161 Rimnicu Vilcea 193
L 244
Fagaras 176 Sibiu 253 P 100
Giurgiu 77 Timisoara 329 M 241
U 80 H 151
Hirsova 151 Urziceni 80 B
Iasi 226 Vaslui 199 D 242 E 161
C 160
Lugo 244 Zerind 374 G 77

Spring 2021 Graph Theory 55 Spring 2021 Graph Theory 56


Thuật toán Bellman Minh họa thuật toán Bellman

Thuật toán Bellman là thuật toán qui hoạch động (dynamic Ví dụ 5.2
algorithm) sử dụng nguyên lý Bellman để tìm đường đi ngắn
nhất. Cho đồ thị có trọng số bất kỳ G = (V , E , L) với n đỉnh. Ý Áp dụng thuật toán Bellman tìm đường đi ngắn nhất cho đồ thị
tưởng của thuật toán được thể hiện qua hàm đệ qui P sau từ đỉnh a. Lưu ý đồ thị có mạch âm
I Hàm Pk (t) là hàm trả về đường đi ngắn nhất từ đỉnh s đến
a 4 c
đỉnh t và đi qua tối đa k đỉnh không tính đỉnh đầu
I Hàm Pk+1 (t) là hàm trả về đường đi ngắn nhất đi từ đỉnh s
đến đỉnh t và đi qua tối đa k + 1 đỉnh không tính đỉnh đầu. -3 2
I Hàm Pk (t) được định nghĩa đệ qui như sau
b
0 t=s
 
P0 (t) =

∞ t 6= s Hình 5.30: Đồ thị có trọng số âm 3 đỉnh
Pk+1 (t) = min (Pk (t) , min (Pk (v) + l (v, t) , ∀v))

(5.3)

Spring 2021 Graph Theory 58 Spring 2021 Graph Theory 59

Minh họa thuật toán Bellman (cont.) Minh họa thuật toán Bellman (cont.)

P0 P1 P2 P3 P4 P5
Bảng 5.5: Đồ thị, ma trận trọng số và bảng tính
a 4 c 0 0 -1 -1 -2 -2
-3 2 a b c a a a a a a
b a 0 2 4
b −3 0 ∞ ∞ 2 2 1 1 0
c ∞ ∞ 0 b b b b b b
P0 P1 P2 P3 P4 P5

0 0 -1 -1 -2 -2 ∞ 4 4 3 3 2
a a a a a a c c c c c c

∞ 2 2 1 1 0 Vậy đường đi ngắn nhất từ a đi qua tối đa 6 đỉnh


b b b b b b
I đến đỉnh c: a b a b a c có trọng số là 2
∞ 4 4 3 3 2 I đến đỉnh b: a b a b a b có trọng số là 0
c c c c c c
I đến đỉnh a: a b a b a có trọng số là -2
Spring 2021 Graph Theory 60 Spring 2021 Graph Theory 61
Minh họa thuật toán Bellman Minh họa thuật toán Bellman (cont.)

Ví dụ 5.3
Bảng 5.6: Đồ thị, ma trận trọng số và bảng tính
Áp dụng thuật toán Bellman tìm đường đi ngắn nhất cho đồ thị
a 4 c
sau từ đỉnh a. Lưu ý đồ thị không có mạch âm a b c
-1 2
b a 0 2 4
a 4 c b −1 0 ∞
c ∞ ∞ 0
P0 P1 P2
-1 2
0 0 0
a a a
b
∞ 2 2
Hình 5.31: Đồ thị có trọng số âm 3 đỉnh b b b

∞ 4 4
c c c

Spring 2021 Graph Theory 62 Spring 2021 Graph Theory 63

Minh họa thuật toán Bellman (cont.) Nhận xét về thuật toán Bellman

P0 P1 P2 Nhận xét
0 0 0 I Nếu trong đồ thị tồn tại mạch âm thì trọng số đường đi sẽ
a a a càng lúc càng giảm
∞ 2 2
I Điều kiện để dừng thuật toán Bellman
b b b I Nếu Pk và Pk+1 là hoàn toàn giống nhau
I Nếu điều kiện trên không xảy ra nghĩa là trong đồ thị tồn
∞ 4 4
c c c tại những mạch âm thì việc dừng thuật toán tại bước
lặp k với đường đi Pk được hiểu là một lời giải cho đường
Vậy đường đi ngắn nhất từ a đi ngắn nhất đi qua tối đa k đỉnh không kể đỉnh bắt đầu
I đến đỉnh c: a c có trọng số là 4
I đến đỉnh b: a b có trọng số là 2
I đến đỉnh a: a là 0

Spring 2021 Graph Theory 64 Spring 2021 Graph Theory 65


Bài tập Bài tập (cont.)

I Áp dụng thuật toán Bellman tìm đường đi ngắn nhất cho đồ I Áp dụng thuật toán Bellman tìm đường đi ngắn nhất cho đồ
thị sau bắt đầu từ đỉnh a thị sau bắt đầu từ đỉnh a

2 e
a b
3 -1
2 c
1 4 1 2 a
4
d 2 c f
5 -2 1
Hình 5.32: Đồ thị có trọng số không âm 4 đỉnh 1

d 8 b

Hình 5.33: Đồ thị có trọng số âm 6 đỉnh

Spring 2021 Graph Theory 66 Spring 2021 Graph Theory 67

Thuật toán Floyd Thuật toán Floyd (cont.)

Thuật toán Floyd cũng là một thuật toán qui hoạch động dùng để Sau đây là cài đặt thuật toán Floyd với
tìm trọng số đường đi ngắn nhất cho tất cả các cặp đỉnh của đồ I biến n là số đỉnh của đồ thị
thị có trọng số G = (V , E , L) có n đỉnh {1, ..., n}. Ý tưởng của I biến l, d và pre lưu ma trận trọng số, thông tin độ dài quãng
thuật toán được trình bày qua hàm đệ qui D như sau
đường ngắng nhất và vết đường đi
I Hàm Dk (i, j) là hàm trả về đường đi ngắn nhất từ đỉnh i đến
đỉnh j sử dụng các đỉnh trung gian {1, ..., k} 1 for (i = 0; i < n; i++)
2 for (j = 0; j < n; j++)
I Hàm Dk+1 (i, j) là hàm trả về đường đi ngắn nhất từ đỉnh i 3 {
đến đỉnh j sử dụng các đỉnh trung gian {1, ..., k, k + 1} 4 d[i][j] = l[i][j];
5 if (d[i][j] == INFINITY )
I Hàm Dk (i, j) được định nghĩa đệ qui như sau 6 pre[i][j] = NO;
D0 (i, j) = l (i, j) 7 else


Dk+1 (i, j) = min (D (i, j) , Dk (i, k + 1) + Dk (k + 1, j)) 8 pre[i][j] = i;


9 }
(5.4) 10 for (k = 0; k < n; k++)
11 for (i = 0; i < n; i++)
12 for (j = 0; j < n; j++)

Spring 2021 Graph Theory 68 Spring 2021 Graph Theory 69


Thuật toán Floyd (cont.) Minh họa thuật toán Floyd

13 if (d[i][j] > d[i][k] + d[k][j])


Ví dụ 5.4
14 {
15 d[i][j] = d[i][k] + d[k][j]; Hãy áp dụng thuật toán Floyd cho đồ thị dưới đây
16 pre[i][j] = pre[k][j];
17 }
1

4
-2
2
3
3
-1
2

Hình 5.34: Đồ thị có trọng số âm

Spring 2021 Graph Theory 70 Spring 2021 Graph Theory 71

Minh họa thuật toán Floyd (cont.) Minh họa thuật toán Floyd (cont.)

Ma trận trọng số của đồ thị là k=0


1 0 1
k=1
1 0 1
k=2
1 0 1
k=3
1 0 1
k=4
1 0 1

1 2 3 4 1 2 1 2 1 2 1 2 1 -2 3 2 4 -1 2
 
1 0 ∞ −2 ∞ 1 -2 3 1 -2 3 1 -2 3 1 -2 3 1 -2 3

2 4 0 3 ∞ 1 4 1 4 1 4 1 -2 3 2 4 1 -2 3 2 4

L=   2 4 1 2 4 1 2 4 1 2 4 1 2 4 1

3 ∞ ∞ 0 2  2 0 2 2 0 2 2 0 2 2 0 2 2 0 2

4 ∞ −1 ∞ 0 2 3 3 2 4 1 -2 3 2 4 1 -2 3 2 4 1 -2 3 2 4 1 -2 3

2 4 2 4 2 4 2 4 1 -2 3 2 4 2 4 1 -2 3 2 4

3 1 3 1 3 1 3 1 3 2 4 -1 2 4 1

3 2 3 2 3 2 3 2 3 2 4 -1 2

3 0 3 3 0 3 3 0 3 3 0 3 3 0 3

3 2 4 3 2 4 3 2 4 3 2 4 3 2 4

4 1 4 1 4 -1 2 4 1 4 -1 2 4 1 4 -1 2 4 1

4 -1 2 4 -1 2 4 -1 2 4 -1 2 4 -1 2

4 3 4 3 4 -1 2 4 1 -2 3 4 -1 2 4 1 -2 3 4 -1 2 4 1 -2 3

4 0 4 4 0 4 4 0 4 4 0 4 4 0 4

Spring 2021 Graph Theory 72 Spring 2021 Graph Theory 73


Minh họa thuật toán Floyd (cont.)
MỘT SỐ KHÁI NIỆM LIÊN QUAN ĐẾN
I Khi k = 0 các đường đi khởi tạo: 1 3, 2 1, 2 3, 3 4, 4 2 ĐƯỜNG ĐI
I Khi k = 1 cập nhật đường đi: 2 1 3
I Khi k = 2 cập nhật đường đi: 4 2 1, 4 2 1 3
I Khi k = 3 cập nhật đường đi: 1 3 4, 2 1 3 4
I Khi k = 4 cập nhật đường đi: 1 3 4 2, 3 4 2 1, 3 4 2

Spring 2021 Graph Theory 74

Ma trận khoảng cách Một số khái niệm

Định nghĩa 5.4 Định nghĩa 5.5


Gọi G là một đồ thị có trọng số không âm có n đỉnh v1 , v2 , ..., vn , Cho đồ thị có trọng số G, độ lệch (eccentricity) của đỉnh v
ma trận khoảng cách (distance matrix) d là ma trận vuông cấp
n với (v) = max{d(v, u)|∀u ∈ V , u 6= v}

d(vi , vj ) = trọng số đường đi ngắn nhất từ vi đến vj Định nghĩa 5.6


Cho đồ thị có trọng số G, tâm (center) của đồ thị là
Lưu ý
Ma trận khoảng cách cho đồ thị vô hướng là một trận đối xứng center (G) = arg min((v))
v∈V

Spring 2021 Graph Theory 76 Spring 2021 Graph Theory 77


Một số khái niệm (cont.) Ví dụ

Định nghĩa 5.7


a
1
Cho đồ thị có trọng số G, bán kính (radius) của đồ thị là 1 c

b 1
rad(G) = min{(v))|∀v ∈ V } 1 1 g
d
1 1
Định nghĩa 5.8 e f

Cho đồ thị có trọng số G, đường kính (diameter) của đồ thị là Hình 5.35: Xác định độ lệch, tâm, bán kính và đường kính

diam(G) = max{(v))|∀v ∈ V }

Spring 2021 Graph Theory 78 Spring 2021 Graph Theory 79

Bài toán về đồ thị Euler


ĐƯỜNG ĐI CÓ RÀNG BUỘC
Lịch sử
Bài toán này có nguồn gốc từ bài toán dân gian. Làm sao đi qua 7
chiếc cầu đúng một lần và trở về nơi xuất phát. Bài toán này đã
được nhà bác học Euler giải quyết trọn vẹn vào năm 1736.

C D

A
(a) bảy cây cầu (b) biểu diễn đồ thị

Hình 5.36: Bài toán bảy cây cầu

Spring 2021 Graph Theory 81


Định nghĩa về đồ thị Euler Định nghĩa về đồ thị Euler (cont.)

Định nghĩa 5.9


Cho một đồ thị G = (V , E )
I Dây chuyền Euler (Euler path) là dây chuyền đi qua tất cả
các cạnh trong đồ thị và mỗi cạnh đi qua đúng một lần
I Đường đi Euler (Euler path) là đường đi qua tất cả các
cạnh của đồ thị và mỗi cạnh được đi qua đúng một lần
I Chu trình Euler (Euler circuit) là dây chuyền Euler có đỉnh
đầu trùng với đỉnh cuối
I Mạch Euler (Euler circuit) là đường đi Euler có đỉnh đầu
trùng với đỉnh cuối
I Đồ thị Euler vô hướng (undirected Euler graph) là đồ thị
vô hướng có chứa ít nhất một chu trình Euler
I Đồ thị Euler có hướng (directed Euler graph) là đồ thị có
hướng chứa ít nhất một chu trình Euler
Spring 2021 Graph Theory 82 Spring 2021 Graph Theory 83

Định lý về chu trình Euler Thuật toán Hierholzer tìm chu trình Euler

Định lý 5.1 Cho một đồ thị liên thông G = (V , E ) có tất cả các đỉnh bậc
chẵn. Thuật toán Hierholzer thực hiện theo nguyên lý tắc sau
Một đa đồ thị vô hướng liên thông G = (V , E ) có chu trình Euler
I Từ đỉnh v tìm một chu trình C trên đồ thị G
khi và chỉ khi mỗi đỉnh của nó đều có bậc chẵn
I Nếu C không phải chu trình Euler thì chu trình C sẽ có một
Chứng minh đỉnh u có một cạnh không thuộc chu trình C
Sinh viên tự chứng minh I Loại bỏ các cạnh của C khỏi đồ thị G
I Từ đỉnh u tìm một chu trình C 0 trên đồ thị G
I Kết hợp chu trình C 0 vào chu trình C
I Quay lại kiểm tra C có phải là chu trình Euler hay không?

Spring 2021 Graph Theory 84 Spring 2021 Graph Theory 85


Cài đặt thuật toán Hierholzer Minh họa cài đặt thuật toán Hierholzer

Thuật toán có thể cài đặt bằng stack như sau Tìm chu trình Euler của đồ thị dưới đây bắt đầu từ đỉnh 1
3 5 7
Algorithm 9 Tìm chu trình Euler C bắt đầu từ đỉnh start
1: procedure find_euler_circle(G, start, C)
2: stack.push(start)
3: while stack.not_empty do
1 4
4: v = stack.top
5: if không còn cạnh kề với v then
6: stack.pop
7: C = C + {v}
2 6 8
8: else
9: Lấy cạnh (v, u) đầu tiên kề với đỉnh v Hình 5.37: Đồ thị liên thông có các đỉnh đều bậc chẵn
10: Xóa cạnh (v, u)
11: stack.push(u)

Spring 2021 Graph Theory 86 Spring 2021 Graph Theory 87

Minh họa cài đặt thuật toán Hierholzer Minh họa cài đặt thuật toán Hierholzer
(cont.) (cont.)

stack = {1} stack = {1, 2}


C = {∅} C = {∅}
3 5 7 3 5 7

1 4 1 4

2 6 8 2 6 8

Hình 5.38: Đưa đỉnh đầu vào stack Hình 5.39: Đưa đỉnh 2 vào stack và xóa cạnh (1,2)

Spring 2021 Graph Theory 88 Spring 2021 Graph Theory 89


Minh họa cài đặt thuật toán Hierholzer Minh họa cài đặt thuật toán Hierholzer
(cont.) (cont.)

stack = {1, 2, 4} stack = {1, 2, 4, 3}


C = {∅} C = {∅}
3 5 7 3 5 7

1 4 1 4

2 6 8 2 6 8

Hình 5.40: Đưa đỉnh 4 vào stack và xóa cạnh (1,4) Hình 5.41: Đưa đỉnh 3 vào stack và xóa cạnh (4,3)

Spring 2021 Graph Theory 90 Spring 2021 Graph Theory 91

Minh họa cài đặt thuật toán Hierholzer Minh họa cài đặt thuật toán Hierholzer
(cont.) (cont.)

stack = {1, 2, 4, 3, 1} stack = {1, 2, 4, 3}


C = {∅} C = {1}

3 5 7 3 5 7

1 4 1 4

2 6 8 2 6 8

Hình 5.42: Đưa đỉnh 1 vào stack và xóa cạnh (3,1) Hình 5.43: Lấy đỉnh 1 ra khỏi stack và thêm vào chu trình C

Spring 2021 Graph Theory 92 Spring 2021 Graph Theory 93


Minh họa cài đặt thuật toán Hierholzer Minh họa cài đặt thuật toán Hierholzer
(cont.) (cont.)

stack = {1, 2, 4} stack = {1, 2, 4, 5}


C = {1, 3} C = {1, 3}

3 5 7 3 5 7

1 4 1 4

2 6 8 2 6 8

Hình 5.44: Lấy đỉnh 3 ra khỏi stack và thêm vào chu trình C Hình 5.45: Đưa đỉnh 5 vào stack và xóa cạnh (4,5)

Spring 2021 Graph Theory 94 Spring 2021 Graph Theory 95

Minh họa cài đặt thuật toán Hierholzer Minh họa cài đặt thuật toán Hierholzer
(cont.) (cont.)

stack = {1, 2, 4, 5, 7} stack = {1, 2, 4, 5, 7, 8}


C = {1, 3} C = {1, 3}

3 5 7 3 5 7

1 4 1 4

2 6 8 2 6 8

Hình 5.46: Đưa đỉnh 7 vào stack và xóa cạnh (5,7) Hình 5.47: Đưa đỉnh 8 vào stack và xóa cạnh (7,8)

Spring 2021 Graph Theory 96 Spring 2021 Graph Theory 97


Minh họa cài đặt thuật toán Hierholzer Minh họa cài đặt thuật toán Hierholzer
(cont.) (cont.)

stack = {1, 2, 4, 5, 7, 8, 6} stack = {1, 2, 4, 5, 7, 8, 6, 4}


C = {1, 3} C = {1, 3}

3 5 7 3 5 7

1 4 1 4

2 6 8 2 6 8

Hình 5.48: Đưa đỉnh 6 vào stack và xóa cạnh (8,6) Hình 5.49: Đưa đỉnh 4 vào stack và xóa cạnh (6,4)

Spring 2021 Graph Theory 98 Spring 2021 Graph Theory 99

Minh họa cài đặt thuật toán Hierholzer Bài tập


(cont.)
Áp dụng thuật toán Hierholzer tìm chu trình Euler cho đồ thị sau
stack = {∅} 1 2 3 4
C = {1, 3, 4, 6, 8, 7, 5, 4, 2, 1}
5 6 7
3 5 7

8 9

10
1 4
Hình 5.51: Đồ thị Euler?

2 6 8

Hình 5.50: Lần lượt lấy các đỉnh ra khỏi stack và thêm vào chu trình C

Spring 2021 Graph Theory 100 Spring 2021 Graph Theory 101
Thuật toán Fleury tìm chu trình Euler Định lý về đường đi Euler

Cho một đồ thị liên thông G = (V , E ) có tất cả các đỉnh bậc chẵn. Định lý 5.2
Algorithm 10 Thuật toán Fleury Một đa đồ thị vô hướng liên thông G = (V , E ) có đường đi Euler
khi và chỉ khi đồ thị có đúng 2 đỉnh bậc lẻ
Thuật toán thực hiện theo hai qui tắc
I Quy tắc 1: Mỗi khi đi qua một cạnh thì xóa cạnh đó và xóa Chứng minh
đỉnh cô lập (nếu có) Sinh viên tự chứng minh
I Quy tắc 2: Không đi qua cạnh cầu trừ phi không còn cách
nào khác

Spring 2021 Graph Theory 102 Spring 2021 Graph Theory 103

Đường đi Euler cho đồ thị có hướng Bài toán người đưa thư Trung Hoa

Định lý 5.3 Bài toán 5.4


Một đa đồ thị có hướng liên thông G = (V , E ) có chu trình Euler Bài toán người đưa thư Trung Hoa (Chinese postman problem)
khi và chỉ tại mỗi đỉnh v của đồ thị đều có d + (v) = d − (v) được phát biểu như sau: Cho một đồ thị liên thông tìm một chu
trình ngắn nhất đi qua các cạnh
Chứng minh
Sinh viên tự chứng minh I Nếu đồ thị không có trọng số thì chu trình ngắn nhất là chu
trình có số cạnh ít nhất
Định lý 5.4
I Nếu đồ thị có trọng số thì chu trình ngắn nhất là chu trình có
Một đa đồ thị có hướng liên thông G = (V , E ) có đường đi Euler
trọng số nhỏ nhất
khi và chỉ tại tất cả các đỉnh v của đồ thị đều có d + (v) = d − (v)
trừ duy nhất 2 đỉnh x, y

d + (x) = d − (x) + 1, d + (y) + 1 = d − (y)

Chứng minh
Sinh viên tự chứng minh
Spring 2021 Graph Theory 104 Spring 2021 Graph Theory 105
Bài toán về đồ thị Hamilton Định nghĩa về đồ thị Hamilton

Lịch sử Định nghĩa 5.10


I Bài toán này xuất phát từ trò đố vui do William Rowan Cho một đồ thị G = (V , E )
Hamilton, nhà toán học người Ailen đưa ra vào năm 1857. I Dây chuyền Hamilton (Hamilton path) là dây chuyền đi
I Giả sử có một khối thập nhị diện đều với mỗi mặt là một ngũ qua tất cả các đỉnh trong đồ thị và mỗi đỉnh đi qua đúng một
giác đều. Mỗi đỉnh trong 20 đỉnh khối này được đặt tên một lần
thành phố. Hãy tìm một cách đi khép kín ghé thăm 20 thành I Đường đi Hamilton (Hamilton path) là đường đi qua tất
phố chỉ một lần cả các đỉnh của đồ thị và mỗi đỉnh được đi qua đúng một lần
I Chu trình Hamilton (Hamilton circuit) là dây chuyền
Hamilton có đỉnh đầu trùng với đỉnh cuối
I Mạch Hamilton (Hamilton circuit) là đường đi Hamilton có
đỉnh đầu trùng với đỉnh cuối
I Đồ thị Hamilton (Hamilton graph) là đồ thị có chứa ít
Hình 5.52: Khối thập nhị diện đều và chu trình Hamilton nhất một chu trình Hamilton

Spring 2021 Graph Theory 106 Spring 2021 Graph Theory 107

Các điều kiện cần Các điều kiện đủ

1. Đồ thị G có đỉnh treo thì sẽ không có chu trình Hamilton Định lý 5.5 (Ore, 1960)
2. Giả sử G là đồ thị hai phía và tập đỉnh thứ nhất có m đỉnh và Cho một đơn đồ thị liên thông G = (V , E ) với số đỉnh n ≥ 3, nếu
tập đỉnh thứ hai có n đỉnh ∀u, v ∈ V không kề nhau và d(u) + d(v) ≥ n thì đồ thị có chu
I Nếu m 6= n thì đồ thị G không có chu trình Hamilton trình Hamilton.
I Nếu m và n khác nhau từ 2 đơn vị trở lên thị đồ thị G
không có đường đi Hamilton Chứng minh
Sinh viên tự chứng minh
Định lý 5.6 (Dirac, 1952)
Cho một đơn đồ thị liên thông G = (V , E ) với số đỉnh n ≥ 3, nếu
∀v ∈ V , d(v) ≥ n2 thì đồ thị có chu trình Hamilton

Chứng minh
Sinh viên tự chứng minh

Spring 2021 Graph Theory 108 Spring 2021 Graph Theory 109
Các điều kiện đủ (cont.) Phương pháp tìm chu trình Hamilton

Định lý 5.7 (Posa) I Thuật toán vét cạn có độ phức tạp lũy thừa
Cho một đơn đồ thị liên thông G = (V , E ) với số đỉnh n ≥ 3; giả
sử có không quá k − 1 đỉnh có bậc không lớn hơn k với Algorithm 11 Tìm chu trình Hamilton
k ∈ 1... n−1 và có không quá n−1 n−1
2 đỉnh có bậc vượt quá 2 với
2 I Quy tắc 1: Nếu đồ thị có đỉnh cô lập hoặc đỉnh treo thì đồ
n lẻ. Khi đó đồ thị G có một chu trình Hamilton
thị không có chu trình Hamilton
Chứng minh I Quy tắc 2: Nếu đỉnh v có bậc d(v) = 2 thì cả hai cạnh kề
Sinh viên tự chứng minh với nó đều phải thuộc chu trình Hamilton
I Quy tắc 3: Khi hai cạnh có chung một đỉnh v thuộc chu
trình Hamilton thì các cạnh kề còn lại của v sẽ không thuộc
chu trình Hamilton
I Quy tắc 4: Tránh tạo ra chu trình con
I Quy tắc 5: Tận dụng tính đối xứng của đồ thị để giảm bớt
trường hợp

Spring 2021 Graph Theory 110 Spring 2021 Graph Theory 111

Minh họa Minh họa

Tìm chu trình Hamilton của đồ thị dưới đây


Nhánh Thực hiện
16 Bắt đầu tại đỉnh 1
16 X Chọn đỉnh 2, cạnh (1,2)
6 X Chọn đỉnh 3, cạnh (2,3)
15 7 6 xóa cạnh (2,13)
15 7 chọn cạnh (12, 13), (13,14)
20 3 4 17
14 8 X Chọn đỉnh 4, cạnh (3,4)
20 3 4 17 xóa cạnh (3,15)
14 8
chọn cạnh (14, 15), (15,6)
2 5
13 9 xóa cạnh (14,20)
2 5 chọn cạnh (19, 20), (20,16)
1 13 9
1
X Chọn đỉnh 5, cạnh (4,5)
12 10
xóa cạnh (4,7)
11 12 10 chọn cạnh (6, 7), (7,8)
19 18 11 xóa cạnh (6,16)
Hình 5.53: Đồ thị biểu diễn khối thập nhị diện đều 19 18 chọn cạnh (16, 17)
X ...
Spring 2021 Graph Theory 112 Spring 2021 Graph Theory 113
Bài tập Bài toán người bán hàng

Hãy tìm chu trình Hamilton (nếu có) của các đồ thị sau Bài toán 5.5
a b c Bài toán người bán hàng (travelling salesman problem) được
phát biểu như sau: Cho một đồ thị liên thông tìm một chu trình
d e f ngắn nhất đi qua các đỉnh

g h i
I Nếu đồ thị không có trọng số thì chu trình ngắn nhất là chu
trình có số cạnh ít nhất
Hình 5.54: Đồ thị Hamilton?
I Nếu đồ thị có trọng số thì chu trình ngắn nhất là chu trình có
trọng số nhỏ nhất

Spring 2021 Graph Theory 114 Spring 2021 Graph Theory 115

Đường đi ngắn nhất


ĐƯỜNG ĐI TRÊN ĐỒ THỊ DAG
I Cho đồ thị DAG G = (V , E ), hãy tìm đường đi sơ cấp ngắn
nhất từ đỉnh s đến các đỉnh

Algorithm 12 Thuật toán tìm đường đi ngắn nhất cho DAG


I Bước 1: Sắp xếp các đỉnh theo thứ tự topo S
I Bước 2: d(s) ← 0 và d(x) ← ∞, ∀x 6= s
I Bước 3: Với mỗi đỉnh v trong S, với mỗi đỉnh u kề v
I Nếu d(u) > d(v) + l(v, u) thì cập nhật
d(u) ← d(v) + l(v, u) và cập nhật cạnh mới (v, u)

Spring 2021 Graph Theory 117


Minh họa thuật toán Minh họa thuật toán (cont.)

d I Thứ tự topo S = {a, b, e, h, f , c, d, g}


I Khởi tạo
3 9
d ∞
15 c 11 g
3 9
12 1 13
7 15 c ∞ 11 g ∞
b f 20
4 6 12 1 13
h 4 7
5 b ∞ f ∞ 20
5 e 4 6
8 h ∞ 4
9 5
5 e ∞
8
a
9
Hình 5.55: Tìm các đường đi ngắn nhất từ đỉnh a đến các đỉnh còn lại a 0

Spring 2021 Graph Theory 118 Spring 2021 Graph Theory 119

Minh họa thuật toán (cont.) Minh họa thuật toán (cont.)

I Thứ tự topo S = {a, b, e, h, f , c, d, g} I Thứ tự topo S = {a, b, e, h, f , c, d, g}


I Duyệt đỉnh a, xem xét các đỉnh kề của nó b, e, h I Duyệt đỉnh b, xem xét các đỉnh kề của nó c, d, h
d ∞ d 20

3 9 3 9

15 c ∞ 11 g ∞ 15 c 17 11 g ∞

12 1 13 12 1 13
7 7
b 5 f ∞ 20 b 5 f ∞ 20
4 6 4 6
h 8 4 h 8 4
5 5
5 e 9 5 e 9
8 8
9 9

a 0 a 0

Spring 2021 Graph Theory 120 Spring 2021 Graph Theory 121
Minh họa thuật toán (cont.) Minh họa thuật toán (cont.)

I Thứ tự topo S = {a, b, e, h, f , c, d, g} I Thứ tự topo S = {a, b, e, h, f , c, d, g}


I Duyệt đỉnh e, xem xét các đỉnh kề của nó f , g, h I Duyệt đỉnh h, xem xét các đỉnh kề của nó c, f
d 20 d 20

3 9 3 9

15 c 17 11 g 29 15 c 15 11 g 29

12 1 13 12 1 13
7 7
b 5 f 13 20 b 5 f 13 20
4 6 4 6
h 8 4 h 8 4
5 5
5 e 9 5 e 9
8 8
9 9

a 0 a 0

Spring 2021 Graph Theory 122 Spring 2021 Graph Theory 123

Minh họa thuật toán (cont.) Minh họa thuật toán (cont.)

I Thứ tự topo S = {a, b, e, h, f , c, d, g} I Thứ tự topo S = {a, b, e, h, f , c, d, g}


I Duyệt đỉnh f , xem xét các đỉnh kề của nó c, g I Duyệt đỉnh c, xem xét các đỉnh kề của nó d, g
d 20 d 17

3 9 3 9

15 c 14 11 g 26 15 c 14 11 g 25

12 1 13 12 1 13
7 7
b 5 f 13 20 b 5 f 13 20
4 6 4 6
h 8 4 h 8 4
5 5
5 e 9 5 e 9
8 8
9 9

a 0 a 0

Spring 2021 Graph Theory 124 Spring 2021 Graph Theory 125
Các bài toán khác Tài liệu tham khảo

I Thuật toán vẫn chạy đúng với đồ thị có trọng số âm Diestel, R. (2005).
I Bài toán tìm đường đi dài nhất cũng có thể sử dụng ý tưởng Graph theory. 2005.
tương tự Springer-Verlag.

Moore, E. F. (1959).
The shortest path through a maze.
Bell Telephone System.

Rosen, K. H. and Krithivasan, K. (2012).


Discrete mathematics and its applications.
McGraw-Hill New York.
Tarjan, R. (1972).
Depth-first search and linear graph algorithms.
SIAM journal on computing, 1(2):146–160.

Spring 2021 Graph Theory 126 Spring 2021 Graph Theory 127

Tài liệu tham khảo (cont.)

Trần, T. and Dương, D. (2013).


Giáo trình lý thuyết đồ thị. 2013.
NXB Đại Học Quốc Gia TPHCM.

West, D. B. et al. (2001).


Introduction to graph theory.
Prentice hall Englewood Cliffs.

Spring 2021 Graph Theory 128

You might also like