Bài giảng Lý thuyết đồ thị - Chương 5: Tìm đường đi ngắn nhất trình bày về giới thiệu về bài toán, thuật toán gán nhãn, thuật toán Dijkstra.
CHƯƠNG V TÌM ĐƯỜNG ĐI NGẮN NHẤT • Trong phần này, giới thiệu giải thuật tìm đường ngắn đỉnh đồ thị có trọng số • Nội dung gồm: – 5.1 Giới thiệu toán – 5.2 Thuật toán gán nhãn – 5.3 Thuật tốn Dijkstra 80 CHƯƠNG V TÌM ĐƯỜNG ĐI NGẮN NHẤT • 5.1 Giới thiệu toán – Xét đồ thị G =< V, E > với V = n, E = m – Với cạnh u, v ∈ E, có giá trị trọng số A u, v – Đặt A u, v = ∞ u, v ∉ E – Nếu dãy v0, v1, , vk đường G – ∑ki=1 A vi−1 , vi – gọi độ dài đường – Bài tốn: Tìm đường ngắn từ đỉnh s đến đỉnh t đồ thị G 81 CHƯƠNG V TÌM ĐƯỜNG ĐI NGẮN NHẤT • 5.2 Thuật tốn gán nhãn (1/4) – Thuật tốn mơ tả sau: – Từ ma trận trọng số A[u,v], u,v∈V, tìm cận d[v] khoảng cách từ s đến tất đỉnh v∈V – Nếu thấy d[u] + A[u,v] < d[v] d[v] = d[u] + A[u, v] (làm tốt lên giá trị d[v]) – Quá trình kết thúc khơng thể làm “tốt lên” – Khi d[v] cho ta giá trị ngắn từ đỉnh s đến đỉnh v – Giá trị d[v] gọi nhãn đỉnh v 82 CHƯƠNG V TÌM ĐƯỜNG ĐI NGẮN NHẤT • 5.2 Thuật tốn gán nhãn (2/4) – Ví dụ thuật tốn: – Tìm đường ngắn từ A đến Z đồ thị G sau 83 CHƯƠNG V TÌM ĐƯỜNG ĐI NGẮN NHẤT • 5.2 Thuật tốn gán nhãn (3/4) – Các bước thực giải thuật: – Bước 1: Gán cho nhãn đỉnh A 0, d A = 0; – Bước 2: Chọn cạnh có độ dài nhỏ xuất phát từ A (cạnh AC), gán nhãn đỉnh kề C với: d C = d A + A A, C = + = 84 CHƯƠNG V TÌM ĐƯỜNG ĐI NGẮN NHẤT • 5.2 Thuật toán gán nhãn (3/4) – Bước 3: Tiếp đó, số cạnh từ đỉnh có nhãn A C tới đỉnh chưa gán nhãn, chọn cạnh cho: nhãn đỉnh + với trọng số cạnh tương ứng = nhỏ gán cho nhãn đỉnh cuối cạnh • • • • Như vậy, ta gán nhãn sau: d[B] = d[B] d[u] + A[u,v]) { d[v] = d[u] + A[u,v]; truoc[v] =u; } } } } 88 CHƯƠNG V TÌM ĐƯỜNG ĐI NGẮN NHẤT • 5.3 Thuật tốn Dijkstra (3/6) – Ví dụ giải thuật Dijkstra: – Cho đồ thị G trên, tìm đường từ 1->6 – Các bước thực Bước lặp Đỉnh Đỉnh Đỉnh (∗) Đỉnh Đỉnh Đỉnh Khởi tạo 0,1 4,1 2,1 (∗) ∞,1 ∞,1 ∞,1 - 3,3 (∗) - 10,3 12,3 ∞,1 - - - 8,2 (∗) 12,3 ∞,1 - - - - 10,4 (∗) 14,4 - - - - - 13,5 (∗) - - - - - 89 CHƯƠNG V TÌM ĐƯỜNG ĐI NGẮN NHẤT • 5.3 Thuật tốn Dijkstra (4/6) – Chương trình minh họa giải thuật Dijkstra: #include "conio.h" #include "io.h" #include "iostream" using namespace std; #define MAX 100 #define TRUE #define FALSE int n, s, z; char chon; int truoc[MAX],d[MAX],G[MAX][MAX]; int final[MAX]; void Init(void){ FILE * fp; int i, j; fp = fopen("dothi.in","r"); fscanf(fp,"%d", &n); cout