Professional Documents
Culture Documents
Đườ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
P = v1 v2 v3 ...vm
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
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
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
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
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
d e e e e e e
a d d d d d d
e
c
c c c c c c
b
a a a a a a
Đố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
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
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
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
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
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
Minh họa thuật toán Dijkstra Minh họa thuật toán Dijkstra
Để 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
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.)
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.27: Tìm theo mọi hướng vs tìm với định hướng
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ộ
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
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)
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
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
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
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
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
4
-2
2
3
3
-1
2
Minh họa thuật toán Floyd (cont.) Minh họa thuật toán Floyd (cont.)
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
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 }
C D
A
(a) bảy cây cầu (b) biểu diễn đồ thị
Đị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?
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)
Minh họa cài đặt thuật toán Hierholzer Minh họa cài đặt thuật toán Hierholzer
(cont.) (cont.)
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)
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)
Minh họa cài đặt thuật toán Hierholzer Minh họa cài đặt thuật toán Hierholzer
(cont.) (cont.)
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
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)
Minh họa cài đặt thuật toán Hierholzer Minh họa cài đặt thuật toán Hierholzer
(cont.) (cont.)
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)
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)
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
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
Spring 2021 Graph Theory 106 Spring 2021 Graph Theory 107
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
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
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.)
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.)
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.)
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.
Spring 2021 Graph Theory 126 Spring 2021 Graph Theory 127