Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 58 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
58
Dung lượng
1,67 MB
Nội dung
BÀI GiẢNG ĐỒ THỊ •Bài tốn đường ngắn •Thuật tốn Ford-Bellman •Thuật tốn Dijkstra •Thuật tốn Floyd Bài tốn đường ngắn Đồ thị có trọng số đồ thị mà cạnh (i,j) gán số thực A(i,j) gọi trọng số cạnh Ta quy ước A(i,j) = ∞, (i,j) không thuộc E A(i,i) = với i Cho đường G Độ dài đường tổng trọng số cạnh đường Bài tốn đường ngắn Đường đi: A B E M Chiều dài: (A, B) + (B, E) + (E, M) = 12 + + 26 = 21 Bài toán đường ngắn Bài tốn: cho đồ thị có trọng số G (E,V) Hai đỉnh s,t thuộc V Tìm đường ngắn s t Đường đi: A H G M Bài toán đường ngắn Nhận xét: Nếu đường A H G M đường ngắn đường đường ngắn A H G, H G M đđ ngắn Bài tốn đường ngắn Giả sử cần tìm đường ngắn hai đỉnh s t đồ thị khơng có chu trình âm Gọi D[s,t] khoảng cách từ s đến t Quy ước khơng có đường từ s đến t D[s,t] = ∞ Để tìm đường ngắn từ s tới t, ta thấy ln có đỉnh t1 khác t cho: D[s,t]=D[s,t1] + A[t1,t] Cơng thức có ý nghĩa là: đường ngắn từ s đến t, ta trước tiên từ s tới t1 sau từ t1 đến t theo cạnh (t1,t) Bài toán đường ngắn S t Bài toán đường ngắn S D(s,t1) t1 A(t1,t) t Bài toán đường ngắn S D(s,t1) t1 A(t1,t) t Đi theo đường ngắn từ S đến t1 Bài toán đường ngắn Rồi theo cạnh t1 đến t S D(s,t1) t1 A(t1,t) Đi theo đường ngắn từ S đến t1 t Thuật toán Dijkstra Check: D: 12 30 21 13 Check: D: 13 Check: D: 42 Check: D: 12 12 Check: D: 16 Lặp lần 3: Tìm đỉnh khơng tối ưu Thuật toán Dijkstra Check: D: 12 30 21 13 Check: D: 13 Check: D: 42 Check: D: 12 12 Check: D: 16 Lặp lần 3: Tìm đỉnh khơng tối ưu Thuật tốn Dijkstra Check: D: 12 30 21 13 Check: D: 13 Check: D: 42 Check: D: 12 12 Check: D: 16 Lặp lần 3: Tìm đỉnh khơng tối ưu Tối ưu đỉnh cịn lại Thuật tốn Dijkstra Check: D: 12 30 21 13 Check: D: 13 Check: D: 42 Check: D: 12 12 Check: D: 14 Lặp lần 3: Tìm đỉnh khơng tối ưu Tối ưu đỉnh cịn lại Thuật tốn Dijkstra Check: D: 12 30 21 13 Check: D: 13 Check: D: 42 Check: D: 12 12 Check: D: 14 Lặp lần 4: Tìm đỉnh khơng tối ưu Thuật toán Dijkstra Check: D: 12 30 21 13 Check: D: 13 Check: D: 42 Check: D: 12 12 Check: D: 14 Lặp lần 4: Tìm đỉnh khơng tối ưu Thuật tốn Dijkstra Check: D: 12 30 21 13 Check: D: 13 Check: D: 42 Check: D: 12 12 Check: D: 14 Lặp lần 4: Tìm đỉnh khơng tối ưu Tối ưu đỉnh lại Thuật toán Dijkstra Check: D: 12 30 21 13 Check: D: 13 Check: D: 26 Check: D: 12 12 Check: D: 14 Lặp lần 4: Tìm đỉnh khơng tối ưu Tối ưu đỉnh lại Thuật toán Dijkstra Check: D: 12 30 21 13 Check: D: 13 Check: D: 26 Check: D: 12 12 Check: D: 14 Lặp lần 5: Tìm đỉnh khơng tối ưu Thuật tốn Dijkstra Check: D: 12 30 21 13 Check: D: 13 Check: D: 26 Check: D: 12 12 Check: D: 14 Lặp lần 5: Tìm đỉnh khơng tối ưu Thuật toán Dijkstra Check: D: 12 30 21 13 Check: D: 26 Check: D: 12 12 Check: D: 14 Check: D: 13 Lặp lần 5: Tất đỉnh đánh dấu Thuật toán kết thúc Thuật tốn Floyd Tìm đường ngắn cặp đỉnh Gọi D[i,j] độ dài đường ngắn từ đỉnh i đến đỉnh j Ta tiến hành cực tiểu D[i,j] theo đỉnh k xét theo thứ tự từ … n công thức: D[i,j]=min{D[i,j],D[i,k]+D[k,j]} Thuật toán Floyd Thuật toán trình bày sau for k:=1 to n for i:=1 to n for j:=1 to n D[i,j]=min{D[i,j], D[i,k]+D[k,j]} Ta xét tính đắn thuật toán Thuật toán Floyd Gọi Dk[i,j] độ dài đường ngắn từ i tới j mà qua đỉnh trung gian thuộc tập {1, ,k} Dễ thấy D0[i,j]=A[i,j] đường trực tiếp Giả sử tính D(k-1)[i,j], ta tiến hành xây dựng Dk[i,j] cách lầy tối ưu hai trường hợp ◦ Đường ngắn không qua k: Dk[i,j]=D(k-1)[i,j] ◦ Đường ngắn có qua k: Dk[i,j]=D(k-1)[i,u]+D(k-1)[u,j] Khi k chạy đến n ta có đường ngắn từ i, tới j qua {1 n} đỉnh BÀI TậP