Professional Documents
Culture Documents
LTDT Floyd
LTDT Floyd
LTDT Floyd
Tên đề tài: Tìm đường đi ngắn nhất . Viết chương trình tìm đường đi ngắn nhất
bằng thuật toán Floyd
Mục lục:
1. Giới thiệu
1.1. Thuật toán Floyd
1.2. Phân công công việc.
2. Phân tích bài toán.
2.1. Mục đích.
2.2. Thuật toán.
2.3. Chứng minh.
2.4. Chú ý
2.5. Ngôn ngữ sử dụng.
2.6. Một số giao diện và kết quả chạy chương trình.
3. Tài liệu tham khảo.
Nội dung:
1. Giới thiệu:
1.1. Thuật toán Floyd:
Xét đồ thị có hướng có trọng số G
Để tìm con đường ngắn nhất giữa mọi cặp đỉnh của G, ta có thể áp dụng
giải thuật Dijkstra nhiều lần hoặc áp dụng một giải thuật đơn giản là giải thuật
Floyd được trình bày dưới đây
1
2.1. Mục đích:
Để tìm con đường ngắn nhất giữa mọi cặp đỉnh của G, ta có thể áp dụng
giải thuật Dijkstra nhiều lần hoặc áp dụng một giải thuật đơn giản là giải thuật
Floyd được trình bày dưới đây.
Giả sử G có tập hợp các đỉnh là V = { v1,v2…vn} và có ma trận khoảng cách
là W
Giải thuật Floyd xây dựng hai dãy các ma trận n*n là Wk và Pk (0 ≤ k ≤ n)
như sau:
.
2.2 Thuật toán:
* giải thuật Floyd
1. W0 = Wk.
P0[i,j] = vj nếu W0[i,j] < ∞ (1 ≤ i , j ≤ n)
Không xác định nếu W0[i,j] = ∞
2. Xây dựng Wk và Pk (1 ≤ k ≤ n) dựa vào Wk-1 và Pk-1 như sau:
Với 1≤ i, j ≤ n. Xét bất đẳng thức
Wk-1[i ,j] > Wk-1[i, k] + Wk-1[k,j] (#)
Nếu (#) đúng thì đặt
Wk[i,j] = Wk-1[i,k] + Wk-1[k,j]
Pk[i,j] = Pk-1[i,k]
Nếu (#) sai thì
Wk[i,j] = Wk-1[i,j]
Pk[i,j] = Pk-1[i,j]
* Định lý
Giải thuật Floyd cho kết quả là các ma trận W* = Wn và P* = Pn.
Thì với 1 ≤ i , j ≤ n,
. Con đường ngắn nhất đi từ vi đến vj… có chiều dài là W*[i,j];
. Đỉnh đứng ngay sau đỉnh vi trên con đường ngắn nhất này là P*[i,j];
2
γ thì γ cũng là đường ngắn nhất nối vi với vj đi qua các đỉnh trung gian
trong { v1,v2,…,vk-1}, nên theo gải thiết quy nạp,
Wk-1,j] = chiều dài γ ≤ Wk-1[i, k] + Wk-1[k,j].
Do đó theo định nghĩa của Wk thì Wk[i, j = Wk-1[i,j].
b) Mọi đường chiều dài ngắn nhất nối vi với vj và đi qua các đỉnh trung gian
trong {v1,v2,…,vk} đều chứa vk.
Gọi γ = vi…vk…vj là một đường ngắn nhất như thế thì vi…vk và vk…vj
cũng là nhửng đường ngắn nhất đi qua các đỉnh trung gian trong {v1,v2,…,vk-1}
và :
Wk-1[I,k] + Wk-1[k,j] = chiều dài (vi…vk) + chiều dài (vk…vj)
= chiều dài (γ) < Wk-1[I,j].
Do đó theo định nghĩa của Wk thì:
Wk[I,j] = Wk-1[I,k] + Wk-1[k,j].
2.4. Chú ý :
a. giải thuật Floyd có thể áp dụng cho đồ thị vô hướng cũng như đồ thị có
hướng. ta chỉ cần thay mổi cạnh vô hướng uv bằng một cặp cạnh có
hướng uv và vu với
c(uv) = c(vu) = c(uv).
b. Đồi thị có hướng G là liên thông mạnh nếu và chỉ nếu mọi phần tử không
nằm trên đường chéo trong ma trận khoảng cách ngắn nhất W* đều hữu
hạn.
c. Giải thuât: Floyd cũng có thể dùng để tìm quan hệ khả liên (reachhability
relation) của một đồ thị có hướng G. chỉ cần đặt trọng số mỗi cạnh đều là
một, khi đó ma trận W* tìm được sẽ cho ta biết có đường nối giữa hai đỉnh
hay không.W*[I,j] < ∞ tương đương có đường nối từ vi đến vj.
d. Đặc biệt W*[I,j] < ∞ tương đương có chu trình trong G chứa vi.
Như vậy ta cũng có thể kiểm tra xem đồ thị có hướngG có chu trình hay
không bằng giải thuật Floyd.
3
4
5
6
7
3. Tài liệu tham khảo
Chu Đức Khánh , Lý thuyết đồ thị.