Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 34 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
34
Dung lượng
307,78 KB
Nội dung
CHƯƠNG 5 ĐƯỜNG ĐI NGẮN NHẤT TRÊN ĐỒ THỊ Tơn Quang Toại Khoa CNTT, Đại học Ngoại ngữ ‐ Tin học TP.HCM Nội dung Các khái niệm mở đầu Phát biểu bài tốn Thuật tốn Dijkstra Thuật tốn Ford – Bellman Thuật tốn Floyd Các khái niệm mở đầu Đồ thị có trọng số: Đồ thị G=(V, E) có trọng số cạnh e=(u,v) của đồ thị gán với con số w(u,v) và gọi trọng số cạnh e. Đường đi: Đường 2 đỉnh s và t được cho dãy đỉnh đó: Các khái niệm mở đầu Độ dài đường đi: Độ dài đường tổng trọng số tất cạnh đường 𝑤 𝑝 𝑤 𝑥 ,𝑥 Phát biểu bài tốn Ví dụ: 18 p = (a, d, f, g) w(p) = 6 + 8 + 2 = 16 b a c 12 g d e 14 f Các khái niệm mở đầu Biểu diễn đồ thị trọng số Cách 1: Ma trận trọng số 𝑣 0/∞ 𝑤 𝑖, 𝑗 𝑛ế𝑢 𝑖, 𝑗 ∉ 𝐸 𝑛ế𝑢 𝑖, 𝑗 ∈ 𝐸 int[,] v; int n; Các khái niệm mở đầu Cách 2: Danh sách cạnh LinkedList e; Cách 3: Danh sách kề LinkedList[] v; Phát biểu bài tốn Phát biểu bài tốn: Cho đồ thị G=(V, E) có trọng số và hai đỉnh s và t cho trước Hãy tìm 1 đường đi từ s đến t sao cho độ dài đường đi là ngắn nhất Phát biểu bài tốn 18 Ví dụ: b p = (a, d, f, g) w(p) = 6 + 8 + 2 = 16 g=t d pshortest = (s, ,t) w(pshortest) = s=a c 12 e 14 f Thuật tốn Dijkstra Giả định của thuật tốn Dijkstra Khơng có cạnh âm trong đồ thị s và t liên thơng với nhau Ý tưởng thuật tốn Dijkstra: Mỗi đỉnh của đồ thị, ta gán một giá trị dist[i]: là độ dài đường đi ngắn nhất từ s đến i Nhiệm vụ: Giảm giá trị mảng dist[ ] từng bước Thuật tốn Bellman – Ford Thuật tốn Dijkstra khơng thể thực hiện khi đồ thị có cạnh âm (đồ thị vơ hướng) hay đồ thị có chu trình âm có thể đến được (đồ thị có hướng) Thuật tốn Bellman – Ford xác định các chu trình âm hay trả về cây đường đi ngắn nhất Thuật tốn Bellman – Ford Thuật tốn Bellman – Ford Bước 1 (Khởi tạo) • 𝑑 𝑖 • 𝑑 𝑠 • k=0 ∞, ∀𝑖 ∈ 𝑉 Bước 2 (Lặp) • k = k+1 • Cập Nhật: Với mọi đỉnh a kề̀ b – 𝑑 𝑠 – 𝑑 𝑏 • Kiểm tra: 𝑑 – Nếu 𝑑 𝑖 𝑑 𝑎 𝑤 𝑎, 𝑏 𝑖 , ∀𝑖 ∈ 𝑉 (tức là 𝑑 𝑖 đã ổn định) thì dừng thuật tốn Lặp cho đến khi k=n Bước 3: Nếu k=n thì đồ thị có chu trình âm Ví dụ Ví dụ 1: Dùng thuật tốn Bellman – Ford Tìm đường đi ngắn nhất từ a đến các đỉnh cịn lại 18 b s=a c 12 g d e 14 f Ví dụ Ví dụ 2: Tìm đường đi ngắn nhất từ đỉnh a đến các đỉnh cịn lại bằng thuật tốn Bellman – Ford 3 1 Ví dụ Ví dụ 3: Tìm đường đi ngắn nhất từ đỉnh a đến các đỉnh cịn lại bằng thuật tốn Bellman – Ford b a e f -6 c d Thuật toán Floyd – Warshall Thuật toán Floyd – Warshall: Thuật toán Floyd – Warshall cho chúng ta cách tìm đường ngắn tất cặp đỉnh đồ thị có chu trình âm Thuật tốn Floyd – Warshall Thuật tốn Floyd – Warshall: Input: G=(V, E) Output: • Ma trận đường đi ngắn nhất giữa các cặp đỉnh – d[i, j]: độ dài đường đi ngắn nhất từ đỉnh i đến đỉnh j • Ma trận ghi nhận đường đi – pre[i, j]: ghi nhận đỉnh đi trước đỉnh j trong đường đi ngắn nhất từ đỉnh i đến đỉnh j Thuật tốn Floyd – Warshall Thuật tốn Floyd – Warshall: Bước 1 (Khởi tạo) • 𝑑 𝑖, 𝑗 𝑎 𝑖, 𝑗 , 𝑖, 𝑗 ∈ 𝑉 ∞, 𝑖, 𝑗 ∉ 𝑉 • pre 𝑖, 𝑗 𝑖 Bước 2 (Lặp) for (int k=0; k