Professional Documents
Culture Documents
LTPD - LTDT Chuong 3 - DuongDiNganNhat - sharedHK2 - 20 - 21 PDF
LTPD - LTDT Chuong 3 - DuongDiNganNhat - sharedHK2 - 20 - 21 PDF
GRAPH THEORY
LÊ THỊ PHƯƠNG DUNG
NỘI DUNG
2
TÀI LIỆU THAM KHẢO
NỘI DUNG:
1. BÀI TOÁN ĐƯỜNG ĐI NGẮN NHẤT
2. THUẬT TOÁN MOORE – DIJKSTRA
3. THUẬT TOÁN BELLMAN – FORDS
4. THUẬT TOÁN FLOYD – WARSHALL
MỘT SỐ ỨNG DỤNG
Tiêu chí: Thời gian, nhiên liệu…
MỘT SỐ ỨNG DỤNG
Đồ thị có trọng số
Bài toán: Tìm đường đi ngắn nhất từ Home đến School
Đường đi ngắn
Cạnh Đỉnh nhất: Đường đi
có tổng trọng số
trên các cạnh là
nhỏ nhất
Trọng số
BÀI TOÁN ĐƯỜNG ĐI NGẮN NHẤT
H A B C D E F S
Ma trận trọng số
H 0 3 2 5 0 0 0 0
Đồ thị vô hướng có ma trận trọng số là
A 3 0 0 0 3 0 0 0
ma trận đối xứng. Các giá trị bên dưới
B 2 0 0 0 1 6 0 0
đường chéo chính có thể khuyết
C 5 0 0 0 0 2 0 0
D 0 3 1 0 0 0 4 0
E 0 0 6 2 0 0 1 4
F 0 0 0 0 4 1 0 2
S 0 0 0 0 0 4 2 0
BÀI TOÁN ĐƯỜNG ĐI NGẮN NHẤT
2 4
1 5
3 6
GIẢI THUẬT MOORE – DIJKSTRA
1.dist = 0 5.dist = ∞
1.prev = -1 5.prev = -1
1 5
3 6
3.dist = ∞
3.prev = -1 6.dist = ∞
6.prev = -1
GIẢI THUẬT MOORE – DIJKSTRA
3 6
3.dist = ∞
3.prev = -1 6.dist = ∞
6.prev = -1
GIẢI THUẬT MOORE – DIJKSTRA
Tìm đường đi ngắn nhất từ 1 đến các đỉnh khác trên đồ
thị có hướng sau đây
2.dist = ∞
2.prev = -1 2 1
Vì 1.dist+len(1,2)=7<2.dist 4.dist = ∞ 3
nên cập nhật 4.prev = -1 4
5
1.dist = 0 min 2 4
6
1.prev = -1
Xét 2 và 3 5.dist = ∞
5.prev = -1
1 5
3 6
3.dist = ∞
3.prev = -1 6.dist = ∞
6.prev = -1
GIẢI THUẬT MOORE – DIJKSTRA
Tìm đường đi ngắn nhất từ 1 đến các đỉnh khác trên đồ
thị có hướng sau đây
2 1
2.dist = 7 4.dist = ∞ 3
2.prev = 1 4.prev = -1 4
5
1.dist = 0 min 2 4
6
1.prev = -1
Xét 2 và 3 5.dist = ∞
5.prev = -1
1 5
3 6
3.dist = ∞
3.prev = -1 6.dist = ∞
6.prev = -1
GIẢI THUẬT MOORE – DIJKSTRA
Tìm đường đi ngắn nhất từ 1 đến các đỉnh khác trên đồ
thị có hướng sau đây
2 1
4.dist = ∞ 3
2.dist = 7
4.prev = -1 4
2.prev = 1
5
1.dist = 0 min 2 4
6
1.prev = -1
Xét 2 và 3 5.dist = ∞
5.prev = -1
1 5
3.dist = ∞ 3 6
3.prev = -1
Vì 1.dist+len(1,3)=1<3.dist nên 6.dist = ∞
cập nhật 6.prev = -1
GIẢI THUẬT MOORE – DIJKSTRA
Tìm đường đi ngắn nhất từ 1 đến các đỉnh khác trên đồ
thị có hướng sau đây
2 1
4.dist = ∞ 3
2.dist = 7
4.prev = -1 4
2.prev = 1
5
1.dist = 0 min 2 4
6
1.prev = -1
Xét 2 và 3 5.dist = ∞
5.prev = -1
1 5
3 6
3.dist = 1
6.dist = ∞
3.prev = 1
6.prev = -1
GIẢI THUẬT MOORE – DIJKSTRA
Tìm đường đi ngắn nhất từ 1 đến các đỉnh khác trên đồ
thị có hướng sau đây
2 3
2.dist = 6 4.dist = ∞ 4
2.prev = 3 4.prev = -1 5
6
2 4
1.dist = 0
1.prev = -1 5.dist = 3
5.prev = 3
1 5
3 6
3.dist = 1 min 6.dist = 8
3.prev = 1 6.prev = 3
GIẢI THUẬT MOORE – DIJKSTRA
Tìm đường đi ngắn nhất từ 1 đến các đỉnh khác trên đồ
thị có hướng sau đây
2 5
2.dist = 5 4.dist = 8 4
2.prev = 5 4.prev = 5 6
2 4
3 6
3.dist = 1 6.dist = 8
3.prev = 1 6.prev = 3
GIẢI THUẬT MOORE – DIJKSTRA
Tìm đường đi ngắn nhất từ 1 đến các đỉnh khác trên đồ
thị có hướng sau đây
2.dist = 5 min 4 2
2.prev = 5 4.dist = 8 6
Xét 4 và 6 4.prev = 5
2 4
1.dist = 0
1.prev = -1 5.dist = 3
5.prev = 3
1 5
3 6
3.dist = 1 6.dist = 6
3.prev = 1 6.prev = 2
GIẢI THUẬT MOORE – DIJKSTRA
Tìm đường đi ngắn nhất từ 1 đến các đỉnh khác trên đồ
thị có hướng sau đây
4 6
2.dist = 5 4.dist = 8
2.prev = 5 4.prev = 5
2 4
1.dist = 0
1.prev = -1 5.dist = 3
5.prev = 3
1 5
3 6
3.dist = 1 6.dist = 6 min
3.prev = 1 6.prev = 2
Vì kề của 6 đã được xét nên đi tiếp
GIẢI THUẬT MOORE – DIJKSTRA
Tìm đường đi ngắn nhất từ 1 đến các đỉnh khác trên đồ
thị có hướng sau đây
4.dist = 8 4
2.dist = 5 4.prev = 5
2.prev = 5 Vì kề của 4 không có nên đi tiếp
2 4
1.dist = 0
1.prev = -1 5.dist = 3
5.prev = 3
1 5
3 6
3.dist = 1 6.dist = 6
3.prev = 1 6.prev = 2
GIẢI THUẬT MOORE – DIJKSTRA
Kết quả đường đi
2.dist = 5 4.dist = 8 Vì tập Q rỗng
2.prev = 5 4.prev = 5 nên giải thuật
2 4 kết thúc
1.dist = 0 5.dist = 3
1.prev = -1 5.prev = 3
1 5
3.dist = 1 3 6
6.dist = 6
3.prev = 1
6.prev = 2
u 1 2 3 4 5 6
u.dist 0 5 1 8 3 6
u.prev -1 5 1 5 3 2
GIẢI THUẬT MOORE – DIJKSTRA
Chạy thuật toán bằng cách lập bảng:
1 2 3 4 5 6
0 (0,-1)
1 * (7,1) (1,1)
2 (6,3) * (3,3) (8,3)
3 (5,5) (8,5) * (8,3)
4 * (8,5) (6,2)
5 (8,5) *
6 *
2 4
1 5
3 6
GIẢI THUẬT MOORE – DIJKSTRA
Hướng dẫn:
• Chạy thuật toán (lập bảng)
• Vẽ đồ thị đường đi 26
THUẬT TOÁN BELLMAN – FORD (– MOORE)
28
THUẬT TOÁN BELLMAN – FORD (– MOORE)
Thuật toán Bellman – Ford tìm đường đi ngắn nhất từ đỉnh xuất
phát đến tất cả các đỉnh còn lại của đồ thị có trọng số tùy ý nhưng
không có chu trình âm
3 chu trình âm
2 3
1
3
1 8 2 -4
-5
3
4
5 4
THUẬT TOÁN BELLMAN – FORD (– MOORE)
function BellmanFord(list vertices, list edges, vertex source) is
::distance[], predecessor[]
//Step 1: initialize graph
for each vertex v in vertices do
distance[v] := inf // Initialize the distance to all vertices to infinity
predecessor[v] := null // And having a null predecessor
distance[source] := 0 // The distance from the source to itself is zero
// Step 2: relax edges repeatedly
for i from 1 to size(vertices)−1 do //just |V|−1 repetitions; i is never referenced
for each edge (u, v) with weight w in edges do
if distance[u] + w < distance[v] then
distance[v] := distance[u] + w
predecessor[v] := u
// Step 3: check for negative-weight cycles
for each edge (u, v) with weight w in edges do
if distance[u] + w < distance[v] then
error "Graph contains a negative-weight cycle" 30
return distance[], predecessor[]
THUẬT TOÁN BELLMAN – FORD (– MOORE)
typedef struct {
int u, v; // cung (u,v)
int w; // trọng số
} Edge;
typedef struct {
int n, m; // n đỉnh,m cung
Edge edges[500]; // danh sách cung
}
THUẬT TOÁN BELLMAN – FORD (– MOORE)
Tìm đường đi ngắn nhất từ đỉnh xuất phát 1 đến tất cả các đỉnh còn
lại của đồ thị 2.dist = ∞ 3.dist = ∞
2.pre = -1 3.pre = -1
3
2 3 (1, 2)
(1, 5)
1 (2, 3)
1.dist = 0 3 (2, 4)
1.pre = -1
(2, 5)
1 8 2 1 (3, 4)
-5 (3, 5)
(4, 3)
3 (5, 4)
4
5 4
5.dist = ∞ 4.dist = ∞
5.pre = -1 4.pre = -1
THUẬT TOÁN BELLMAN – FORD (– MOORE)
Tìm đường đi ngắn nhất từ đỉnh xuất phát 1 đến tất cả các đỉnh còn
lại của đồ thị 2.dist = 1 3.dist = ∞
2.pre = 1 3.pre = -1
3
2 3
Xét đỉnh 1:
1 Duyệt qua tất
1.dist = 0 3
1.pre = -1
cả các cung của
đồ thị và tiến
1 8 2 1
hành cập nhật
-5 nhãn tại các
(1, 2) 3 đỉnh nếu đường
(1, 5) 4 đi mới ngắn hơn
(2, 3) 5 4 đường đi cũ
(2, 4)
(2, 5) 5.dist = ∞ 4.dist = ∞
(3, 4) 5.pre = -1 4.pre = -1
(3, 5)
(4, 3)
(5, 4)
THUẬT TOÁN BELLMAN – FORD (– MOORE)
Tìm đường đi ngắn nhất từ đỉnh xuất phát 1 đến tất cả các đỉnh còn
lại của đồ thị 2.dist = 1 3.dist = ∞
2.pre = 1 3.pre = -1
3
2 3
1
1.dist = 0 3
1.pre = -1
1 8 2 1
-5
(1, 2) 3
(1, 5) 4
(2, 3) 5 4
(2, 4)
(2, 5) 5.dist = 3 4.dist = ∞
(3, 4) 5.pre = 1 4.pre = -1
(3, 5)
(4, 3)
(5, 4)
THUẬT TOÁN BELLMAN – FORD (– MOORE)
Tìm đường đi ngắn nhất từ đỉnh xuất phát 1 đến tất cả các đỉnh còn
lại của đồ thị 2.dist = 1 3.dist = 3
2.pre = 1 3.pre = 2
3
2 3
1
1.dist = 0 3
1.pre = -1
1 8 2 1
-5
(1, 2) 3
(1, 5) 4
(2, 3) 5 4
(2, 4)
(2, 5) 5.dist = 3 4.dist = ∞
(3, 4) 5.pre = 1 4.pre = -1
(3, 5)
(4, 3)
(5, 4)
THUẬT TOÁN BELLMAN – FORD (– MOORE)
Tìm đường đi ngắn nhất từ đỉnh xuất phát 1 đến tất cả các đỉnh còn
lại của đồ thị 2.dist = 1 3.dist = 3
2.pre = 1 3.pre = 2
3
2 3
1
1.dist = 0 3
1.pre = -1
1 8 2 1
-5
(1, 2) 3
(1, 5) 4
(2, 3) 5 4
(2, 4)
(2, 5) 5.dist = 3 4.dist = 4
(3, 4) 5.pre = 1 4.pre = 2
(3, 5)
(4, 3)
(5, 4)
THUẬT TOÁN BELLMAN – FORD (– MOORE)
Tìm đường đi ngắn nhất từ đỉnh xuất phát 1 đến tất cả các đỉnh còn
lại của đồ thị 2.dist = 1 3.dist = 3
2.pre = 1 3.pre = 2
3
2 3
1
1.dist = 0 3
1.pre = -1
1 8 2 1
-5
(1, 2) 3
(1, 5) 4
(2, 3) 5 4
(2, 4)
(2, 5) 5.dist = 3 4.dist = 4
(3, 4) 5.pre = 1 4.pre = 2
(3, 5)
(4, 3)
(5, 4)
THUẬT TOÁN BELLMAN – FORD (– MOORE)
Tìm đường đi ngắn nhất từ đỉnh xuất phát 1 đến tất cả các đỉnh còn
lại của đồ thị 2.dist = 1 3.dist = 4
2.pre = 1 3.pre = 2
3
2 3
1
1.dist = 0 3
1.pre = -1
1 8 2 1
-5
(1, 2) 3
(1, 5) 4
(2, 3) 5 4
(2, 4)
(2, 5) 5.dist = -1 4.dist = 4
(3, 4) 5.pre = 3 4.pre = 2
(3, 5)
(4, 3)
(5, 4)
THUẬT TOÁN BELLMAN – FORD (– MOORE)
Tìm đường đi ngắn nhất từ đỉnh xuất phát 1 đến tất cả các đỉnh còn
lại của đồ thị 2.dist = 1 3.dist = 4
2.pre = 1 3.pre = 2
3
2 3
1
1.dist = 0 3
1.pre = -1
1 8 2 1
-5
(1, 2) 3
(1, 5) 4
(2, 3) 5 4
(2, 4)
(2, 5) 5.dist = -1 4.dist = 4
(3, 4) 5.pre = 3 4.pre = 2
(3, 5)
(4, 3)
(5, 4)
THUẬT TOÁN BELLMAN – FORD (– MOORE)
Tìm đường đi ngắn nhất từ đỉnh xuất phát 1 đến tất cả các đỉnh còn
lại của đồ thị 2.dist = 1 3.dist = 4
2.pre = 1 3.pre = 2
3
2 3
1
1.dist = 0 3
1.pre = -1
1 8 2 1
-5
(1, 2) 3
(1, 5) 4
(2, 3) 5 4
(2, 4)
(2, 5) 5.dist = -1 4.dist = 4
(3, 4) 5.pre = 3 4.pre = 2
(3, 5)
(4, 3)
(5, 4)
THUẬT TOÁN BELLMAN – FORD (– MOORE)
Tìm đường đi ngắn nhất từ đỉnh xuất phát 1 đến tất cả các đỉnh còn
lại của đồ thị 2.dist = 1 3.dist = 4
2.pre = 1 3.pre = 2
3
2 3
1
1.dist = 0 3
1.pre = -1
1 8 2 1
-5
(1, 2) 3
(1, 5) 4
(2, 3) 5 4
(2, 4)
(2, 5) 5.dist = -1 4.dist = 3
(3, 4) 5.pre = 3 4.pre = 5
(3, 5)
(4, 3)
(5, 4)
THUẬT TOÁN BELLMAN – FORD (– MOORE)
Tìm đường đi ngắn nhất từ đỉnh xuất phát 1 đến tất cả các đỉnh còn
lại của đồ thị 2.dist = 1 3.dist = 4
2.pre = 1 3.pre = 2
3
2 3
Xét đỉnh 2:
1 Duyệt qua tất
1.dist = 0 3
1.pre = -1
cả các cung của
đồ thị và tiến
1 8 2 1
hành cập nhật
-5 nhãn tại các
(1, 2) 3 đỉnh nếu đường
(1, 5) 4 đi mới ngắn hơn
(2, 3) 5 4 đường đi cũ
(2, 4)
(2, 5) 5.dist = -1 4.dist = 3
(3, 4) 5.pre = 3 4.pre = 5
(3, 5)
(4, 3)
(5, 4)
THUẬT TOÁN BELLMAN – FORD (– MOORE)
Tìm đường đi ngắn nhất từ đỉnh xuất phát 1 đến tất cả các đỉnh còn
lại của đồ thị 2.dist = 1 3.dist = 4
2.pre = 1 3.pre = 2
3
2 3
Xét đỉnh 3:
1 Duyệt qua tất
1.dist = 0 3
1.pre = -1
cả các cung của
đồ thị và tiến
1 8 2 1
hành cập nhật
-5 nhãn tại các
(1, 2) 3 đỉnh nếu đường
(1, 5) 4 đi mới ngắn hơn
(2, 3) 5 4 đường đi cũ
(2, 4)
(2, 5) 5.dist = -1 4.dist = 3
(3, 4) 5.pre = 3 4.pre = 5
(3, 5)
(4, 3)
(5, 4)
THUẬT TOÁN BELLMAN – FORD (– MOORE)
Tìm đường đi ngắn nhất từ đỉnh xuất phát 1 đến tất cả các đỉnh còn
lại của đồ thị 2.dist = 1 3.dist = 4
2.pre = 1 3.pre = 2
3
2 3
Xét đỉnh 4:
1 Duyệt qua tất
1.dist = 0 3
1.pre = -1
cả các cung của
đồ thị và tiến
1 8 2 1
hành cập nhật
-5 nhãn tại các
(1, 2) 3 đỉnh nếu đường
(1, 5) 4 đi mới ngắn hơn
(2, 3) 5 4 đường đi cũ
(2, 4)
(2, 5) 5.dist = -1 4.dist = 3
(3, 4) 5.pre = 3 4.pre = 5
(3, 5)
(4, 3)
(5, 4)
THUẬT TOÁN BELLMAN – FORD (– MOORE)
Tìm đường đi ngắn nhất từ đỉnh xuất phát 1 đến tất cả các đỉnh còn
lại của đồ thị 2.dist = 1 3.dist = 4
2.pre = 1 3.pre = 2
3
2 3
Phát hiện chu
1 trình âm:
1.dist = 0 3
1.pre = -1
Duyệt qua tất
cả các cung của
1 8 2 1
đồ thị một lần
-5 nữa.
(1, 2) 3 Nếu còn có
(1, 5) 4 thể cập nhật giá
(2, 3) 5 4 trị đường đi thì
(2, 4) ta kết luận đồ thị
(2, 5) 5.dist = -1 4.dist = 3 có chu trình âm.
(3, 4) 5.pre = 3 4.pre = 5
Ngược lại thì
(3, 5)
(4, 3)
không có chu
(5, 4) trình âm.
THUẬT TOÁN BELLMAN – FORD (– MOORE)
Kết quả đường đi ngắn nhất từ đỉnh xuất phát 1 đến tất cả các đỉnh
còn lại của đồ thị 2.dist = 1 3.dist = 4
2.pre = 1 3.pre = 2
3
2 3
1
1.dist = 0 3
1.pre = -1
1 8 2 1
-5
3
4
5 4
5.dist = -1 4.dist = 3
5.pre = 3 4.pre = 5
Ở bước lặp, giải thuật BF chỉ duyệt n-1 đỉnh
Lần lặp thứ n dùng để phát hiện chu trình âm
THUẬT TOÁN BELLMAN – FORD (– MOORE)
2 3 3
Chạy thuật toán bằng cách lập bảng: 1
3
1 2 3 4 5 1 8 2 1
-5
KT (0,-) (∞,-) (∞,-) (∞,-) (∞,-) 3
5 4 4
Đỉnh 1: Đỉnh 2:
(x,y) w 1 2 3 4 5 1 2 3 4 5
(1,2) 1 (1,1) (1,1)
(1,5) 3 (3,1) (-1,3)
(2,3) 3 (4,2) (4,2)
(2,4) 3 (4,2) (3,5)
(2,5) 8 (3,1) (-1,3)
(3,4) 1 (4,2) (3,5)
(3,5) -5 (-1,3) (-1,3)
(4,3) 2 (4,2) (4,2)
(5,4) 4 (3,5) (3,5)
KQ (0,-) (1,1) (4,2) (3,5) (-1,3) (0,-) (1,1) (4,2) (3,5) (-1,3)
THUẬT TOÁN BELLMAN – FORD (– MOORE)
2 3 3
1
1 2 3 4 5 3
1 8 2 1
KQ 2 (0,-) (1,1) (4,2) (3,5) (-1,3) -5
3
5 4 4
Đỉnh 3: Đỉnh 4:
(x,y) w 1 2 3 4 5 1 2 3 4 5
(1,2) 1 (1,1) (1,1)
(1,5) 3 (-1,3) (-1,3)
(2,3) 3 (4,2) (4,2)
(2,4) 3 (3,5) (3,5)
(2,5) 8 (-1,3) (-1,3)
(3,4) 1 (3,5) (3,5)
(3,5) -5 (-1,3) (-1,3)
(4,3) 2 (4,2) (4,2)
(5,4) 4 (3,5) (3,5)
KQ (0,-) (1,1) (4,2) (3,5) (-1,3) (0,-) (1,1) (4,2) (3,5) (-1,3)
THUẬT TOÁN BELLMAN – FORD (– MOORE)
BF cải tiến
Nếu kết quả lần lặp
thứ i giống với kết quả
lần lặp thứ i-1 thì giải
thuật dừng
1 2 3 4 5
KT (0,-) (∞,-) (∞,-) (∞,-) (∞,-) Vì kết quả
lần lặp 2
KQ 1 (0,-) (1,1) (4,2) (3,5) (-1,3) giống với
KQ 2 (0,-) (1,1) (4,2) (3,5) (-1,3) kết quả lần
lặp 1 nên
thuật toán
dừng
THUẬT TOÁN BELLMAN – FORD (– MOORE)
Bài tập: Tìm đường đi ngắn nhất từ đỉnh a đến tất cả các đỉnh
còn lại của đồ thị
THUẬT TOÁN BELLMAN – FORD (– MOORE)
a b c d e
KT 0,-1 ∞,-1 ∞,-1 ∞,-1 ∞,-1
a b c d e
0,-1 0,c -1,a 2,b -1,d
x,y w 3
6 1
1,2 6 -2
1,3 5 5
1,4 5
2,5 -1
-2 -3
3,2 -2 5
3,4 -2 -1
3,5 1
4,6 -1 Yêu cầu: Viết tay bài làm ra giấy và nộp cho cô
5,7 3 Hướng dẫn:
6,7 -3 Chạy thuật toán (lập bảng)
Vẽ đồ thị đường đi
THUẬT TOÁN FLOYD – WARSHALL
Thuật toán Floyd – Warshall còn được gọi là thuật toán Floyd, thuật
toán Roy–Warshall, thuật toán Roy–Floyd, hay thuật toán WFI.
Professor
Robert W Floyd
Born June 8, 1936
New York City, New York, United
States
Died September 25, 2001 (aged 65)
Stanford, California, United States
Stephen Warshall
Bernard Roy
France
Born 15 March 1934
Died 28 October 2017
https://www.euro-online.org/web/pages/1622/bernard-roy-1934-2017
THUẬT TOÁN FLOYD – WARSHALL
Thuật toán Floyd – Warshall tìm đường đi ngắn nhất giữa tất cả các
cặp đỉnh của đồ thị có trọng số tùy ý nhưng không có chu trình âm
procedure Path(u, v)
if next[u][v] = null then
return []
path = [u]
while u ≠ v
u ← next[u][v]
path.append(u)
return path
THUẬT TOÁN FLOYD – WARSHALL
for each edge (u, v) do j
k=0
dist[u][v] ← w(u, v) 1 2 3 4
next[u][v] ← v 1 0,1 ∞,2 −2,3 ∞,4
for each vertex v do
dist[v][v] ← 0 2 4,1 0,2 3,3 ∞,4
i
for k from 1 to |V| do next[v][v] ← v 3 ∞,1 ∞,2 0,3 2,4
for i from 1 to |V| 4 ∞,1 −1,2 ∞,3 0,4
for j from 1 to |V|
if dist[i][j] > dist[i][k] + dist[k][j] then
dist[i][j] ← dist[i][k] + dist[k][j]
next[i][j] ← next[i][k]
……………………………………………………………………………………
k=1: j
k=1
d(1,1)+d(1,1)=0 d(1,1)=0; d(1,2)=∞; 1 2 3 4
d(1,3)=∞; d(1,4)=∞
1
2
i
3
4
THUẬT TOÁN FLOYD – WARSHALL
for each edge (u, v) do j
k=0
dist[u][v] ← w(u, v) 1 2 3 4
next[u][v] ← v 1 0,1 ∞,2 −2,3 ∞,4
for each vertex v do
dist[v][v] ← 0 2 4,1 0,2 3,3 ∞,4
i
for k from 1 to |V| do next[v][v] ← v 3 ∞,1 ∞,2 0,3 2,4
for i from 1 to |V| 4 ∞,1 −1,2 ∞,3 0,4
for j from 1 to |V|
if dist[i][j] > dist[i][k] + dist[k][j] then
dist[i][j] ← dist[i][k] + dist[k][j]
next[i][j] ← next[i][k]
……………………………………………………………………………………
k=1: j
k=1
d(1,1)+d(1,1)=0 d(1,1)=0; d(1,2)=∞; 1 2 3 4
d(1,3)=∞; d(1,4)=∞
1 0,1 ∞,2 −2,3 ∞,4
d(2,1)+d(1,1)=4 d(2,1)=4; d(2,2)=∞; 2
d(2,1)+d(1,3)=3-1=2d(2,3)=2; i
d(2,4)=∞ (vı̀ d(1,4)=∞) 3
4
THUẬT TOÁN FLOYD – WARSHALL
for each edge (u, v) do j
k=0
dist[u][v] ← w(u, v) 1 2 3 4
next[u][v] ← v 1 0,1 ∞,2 −2,3 ∞,4
for each vertex v do
dist[v][v] ← 0 2 4,1 0,2 3,3 ∞,4
i
for k from 1 to |V| do next[v][v] ← v 3 ∞,1 ∞,2 0,3 2,4
for i from 1 to |V| 4 ∞,1 −1,2 ∞,3 0,4
for j from 1 to |V|
if dist[i][j] > dist[i][k] + dist[k][j] then
dist[i][j] ← dist[i][k] + dist[k][j]
next[i][j] ← next[i][k]
……………………………………………………………………………………
k=1: j
k=1
d(2,1)+d(1,1)=4 d(2,1)=4; d(2,2)=∞; 1 2 3 4
d(2,1)+d(1,3)=3-1=2d(2,3)=2;
d(2,4)=∞ (vı̀ d(1,4)=∞) 1 0,1 ∞,2 −2,3 ∞,4
2 4,1 0,2 2,1 ∞,4
d(3,1)=∞; d(3,2)=∞ (vı̀ d(3,1)=∞); i
d(3,3)=0; d(3,4)=2 3
4
THUẬT TOÁN FLOYD – WARSHALL
for each edge (u, v) do j
k=0
dist[u][v] ← w(u, v) 1 2 3 4
next[u][v] ← v 1 0,1 ∞,2 −2,3 ∞,4
for each vertex v do
dist[v][v] ← 0 2 4,1 0,2 3,3 ∞,4
i
for k from 1 to |V| do next[v][v] ← v 3 ∞,1 ∞,2 0,3 2,4
for i from 1 to |V| 4 ∞,1 −1,2 ∞,3 0,4
for j from 1 to |V|
if dist[i][j] > dist[i][k] + dist[k][j] then
dist[i][j] ← dist[i][k] + dist[k][j]
next[i][j] ← next[i][k]
……………………………………………………………………………………
k=1: j
k=1
d(3,1)=∞; d(3,2)=∞ (vı̀ d(3,1)=∞); 1 2 3 4
d(3,3)=0; d(3,4)=2
1 0,1 ∞,2 −2,3 ∞,4
d(4,1)=∞; d(4,2)=-1; d(4,3)=∞; d(4,4)=0 2 4,1 0,2 2,1 ∞,4
i
3 ∞,1 ∞,2 0,3 2,4
4
THUẬT TOÁN FLOYD – WARSHALL
for each edge (u, v) do j
k=0
dist[u][v] ← w(u, v) 1 2 3 4
next[u][v] ← v 1 0,1 ∞,2 −2,3 ∞,4
for each vertex v do
dist[v][v] ← 0 2 4,1 0,2 3,3 ∞,4
i
for k from 1 to |V| do next[v][v] ← v 3 ∞,1 ∞,2 0,3 2,4
for i from 1 to |V| 4 ∞,1 −1,2 ∞,3 0,4
for j from 1 to |V|
if dist[i][j] > dist[i][k] + dist[k][j] then
dist[i][j] ← dist[i][k] + dist[k][j]
next[i][j] ← next[i][k]
……………………………………………………………………………………
k=1: j
k=1
d(4,1)=∞; d(4,2)=-1; d(4,3)=∞; d(4,4)=0 1 2 3 4
1 0,1 ∞,2 −2,3 ∞,4
2 4,1 0,2 2,1 ∞,4
i
3 ∞,1 ∞,2 0,3 2,4
4 ∞,1 −1,2 ∞,3 0,4
THUẬT TOÁN FLOYD – WARSHALL
for each edge (u, v) do j
k=0
dist[u][v] ← w(u, v) 1 2 3 4
next[u][v] ← v 1 0,1 ∞,2 −2,3 ∞,4
for each vertex v do
dist[v][v] ← 0 2 4,1 0,2 3,3 ∞,4
i
next[v][v] ← v 3 ∞,1 ∞,2 0,3 2,4
for k from 1 to |V| do 4 ∞,1 −1,2 ∞,3 0,4
for i from 1 to |V|
for j from 1 to |V|
if dist[i][j] > dist[i][k] + dist[k][j] then
dist[i][j] ← dist[i][k] + dist[k][j]
next[i][j] ← next[i][k]
…………………………………………………………………………………… j
k=1
Nhận xét: 1 2 3 4
1. Tại bước lặp thứ k:
- Giá trị tại dòng k không đổi 1 0,1 ∞,2 −2,3 ∞,4
- Giá trị tại cột k không đổi 2 4,1 0,2 2,1 ∞,4
2. Nếu đồ thị không có chu trình âm thì giá trị i
distance tại đường chéo luôn là 0 3 ∞,1 ∞,2 0,3 2,4
4 ∞,1 −1,2 ∞,3 0,4
THUẬT TOÁN FLOYD – WARSHALL
for each edge (u, v) do j
k=0
dist[u][v] ← w(u, v) 1 2 3 4
next[u][v] ← v 1 0,1 ∞,2 −2,3 ∞,4
for each vertex v do
dist[v][v] ← 0 2 4,1 0,2 3,3 ∞,4
i
next[v][v] ← v 3 ∞,1 ∞,2 0,3 2,4
for k from 1 to |V| do 4 ∞,1 −1,2 ∞,3 0,4
for i from 1 to |V|
for j from 1 to |V|
if dist[i][j] > dist[i][k] + dist[k][j] then
dist[i][j] ← dist[i][k] + dist[k][j]
next[i][j] ← next[i][k]
…………………………………………………………………………………… j
k=1
Nhận xét: 1 2 3 4
1. Tại bước lặp thứ k:
- Giá trị tại dòng k không đổi 1 0,1 ∞,2 −2,3 ∞,4
- Giá trị tại cột k không đổi 2 4,1 0,2 2,1 ∞,4
2. Nếu đồ thị không có chu trình âm thì giá trị i
distance tại đường chéo luôn là 0 3 ∞,1 ∞,2 0,3 2,4
3. Giá trị tại ô (i,j) cập nhật (nếu có) bằng giá trị 4 ∞,1 −1,2 ∞,3 0,4
tại ô (i,k) cộng giá trị tại ô (k,j)
THUẬT TOÁN FLOYD – WARSHALL
j
k=2
1 2 3 4
1 0,1 ∞,2 −2,3 ∞,4
2 4,1 0,2 2,1 ∞,4
i
3 ∞,1 ∞,2 0,3 2,4
4 3,2 −1,2 1,2 0,4
j
j k=3
k=1 1 2 3 4
1 2 3 4
1 0,1 ∞,2 −2,3 0,3
1 0,1 ∞,2 −2,3 ∞,4
2 4,1 0,2 2,1 4,1
2 4,1 0,2 2,1 ∞,4 i
i 3 ∞,1 ∞,2 0,3 2,4
3 ∞,1 ∞,2 0,3 2,4
4 3,2 −1,2 1,2 0,4
4 ∞,1 −1,2 ∞,3 0,4
THUẬT TOÁN FLOYD – WARSHALL
j
k=3
1 2 3 4
1 0,1 ∞,2 −2,3 0,3
2 4,1 0,2 2,1 4,1
i
3 ∞,1 ∞,2 0,3 2,4
4 3,2 −1,2 1,2 0,4
j
k=4
1 2 3 4
1 0,1 -1,3 −2,3 0,3
2 4,1 0,2 2,1 4,1
i
3 5,4 1,4 0,3 2,4
4 3,2 −1,2 1,2 0,4
THUẬT TOÁN FLOYD – WARSHALL
Cách truy vết đường đi:
procedure Path(u, v)
if next[u][v] = null then
return []
path = [u]
while u ≠ v
u ← next[u][v]
j path.append(u)
k=4 return path
1 2 3 4
Path(1,4): u=1
1 0,1 -1,3 −2,3 0,3
next(1,4)=3 u=3
2 4,1 0,2 2,1 4,1 next(3,4)=4u=4=v stop
i
3 5,4 1,4 0,3 2,4 path=134
Path(3,1): u=3
4 3,2 −1,2 1,2 0,4 next(3,1)=4u=4
Path(4,1): u=4 next(4,1)=2u=2
next(4,1)=2u=2 next(2,1)=1u=1=vstop
next(2,1)=1u=1=vstop path=3421
path=421
THUẬT TOÁN FLOYD – WARSHALL
j
Bài tập 1: Tìm đường đi ngắn k=0
nhất giữa tất cả các cặp đỉnh 1 2 3 4 5
1 0,1 3,2 8,3 ∞,4 -4,5
2 ∞,1 0,2 ∞,3 1,4 7,5
i 3 ∞,1 4,2 0,3 -5,4 ∞,5
4 2,1 ∞,2 ∞,3 0,4 ∞,5
5 ∞,1 ∞,2 ∞,3 6,4 0,5
j
k=1
1 2 3 4 5
1 0,1 3,2 8,3 ∞,4 -4,5
2 ∞,1 0,2 ∞,3 1,4 7,5
i 3 ∞,1 4,2 0,3 -5,4 ∞,5
4 2,1 5,1 10,1 0,4 -2,1
5 ∞,1 ∞,2 ∞,3 6,4 0,5
THUẬT TOÁN FLOYD – WARSHALL
j j
k=2 k=4
1 2 3 4 5 1 2 3 4 5
1 0,1 3,2 8,3 4,2 -4,5 1 0,1 3,2 8,3 3,3 -4,5
2 ∞,1 0,2 ∞,3 1,4 7,5 2 3,4 0,2 11,4 1,4 -1,4
i 3 ∞,1 4,2 0,3 -5,4 11,2 i 3 -3,4 0,4 0,3 -5,4 -7,4
4 2,1 5,1 10,1 0,4 -2,1 4 2,1 5,1 10,1 0,4 -2,1
5 ∞,1 ∞,2 ∞,3 6,4 0,5 5 8,4 11,4 16,4 6,4 0,5
j j
k=3 k=5
1 2 3 4 5 1 2 3 4 5
1 0,1 3,2 8,3 3,3 -4,5 1 0,1 3,2 8,3 2,5 -4,5
2 ∞,1 0,2 ∞,3 1,4 7,5 2 3,4 0,2 11,4 1,4 -1,4
i 3 ∞,1 4,2 0,3 -5,4 11,2 i 3 -3,4 0,4 0,3 -5,4 -7,4
4 2,1 5,1 10,1 0,4 -2,1 4 2,1 5,1 10,1 0,4 -2,1
5 ∞,1 ∞,2 ∞,3 6,4 0,5 5 8,4 11,4 16,4 6,4 0,5
THUẬT TOÁN FLOYD – WARSHALL
j
k=5
1 2 3 4 5
1 0,1 3,2 8,3 2,5 -4,5
2 3,4 0,2 11,4 1,4 -1,4
i 3 -3,4 0,4 0,3 -5,4 -7,4
4 2,1 5,1 10,1 0,4 -2,1
5 8,4 11,4 16,4 6,4 0,5
Path(1,4): u=1
next(1,4)=5 u=5
next(5,4)=4u=4=v stop
Truy vết đường đi: path=154
Path(3,1): u=3
next(3,1)=4u=4
next(4,1)=1=vstop
path=341
TÓM TẮT CHƯƠNG 3
ĐƯỜNG ĐI NGẮN NHẤT
Thuật toán Moore-Dijkstra
Tìm đường đi ngắn nhất từ đỉnh xuất phát đến các đỉnh khác
trên đồ thị có trọng số dương
Thuật toán bellman – fords
Thuật toán Bellman – Ford tìm đường đi ngắn nhất từ đỉnh xuất
phát đến tất cả các đỉnh còn lại của đồ thị có trọng số tùy ý
nhưng không có chu trình âm
Thuật toán floyd – warshall
Thuật toán Floyd – Warshall tìm đường đi ngắn nhất giữa tất cả
các cặp đỉnh của đồ thị có trọng số tùy ý nhưng không có chu
trình âm