Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 37 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
37
Dung lượng
405,09 KB
Nội dung
CHƯƠNG CÁC THUẬT TOÁN DUYỆT ĐỒ THỊ NỘI DUNG Các thuật toán duyệt đồ thị Một số ứng dụng thuật toán duyệt đồ thị 6.1 CÁC PHÉP DUYỆT ĐỒ THỊ Khái niệm duyệt đồ thị Thuật toán duyệt đồ thị Duyệt đồ thị theo chiều sâu Duyệt đồ thị theo chiều rộng KHÁI NIỆM DUYỆT ĐỒ THỊ Duyệt đồ thị cách liệt kê tất đỉnh đồ thị thành danh sách tuyến tính - Cho cách “đi qua” tất đỉnh đồ thị để truy nhập, thêm bớt thông tin … - Duyệt đồ thị khơng phụ thuộc vào hướng cạnh VÍ DỤ 5.1 D B H A E G C F Thứ tự duyệt: A, B, D, H, E, G, F, C 6.2 THUẬT TOÁN DUYỆT ĐỒ THỊ Cho đồ thị G = (V, E) với x0 đỉnh G Dùng cấu trúc liệu kiểu danh sách, kí hiệu DS, để chứa đỉnh 6.2 THUẬT TOÁN DUYỆT ĐỒ THỊ (tiếp) Thuật toán 1) Khởi đầu: DS {x0} 2) Lấy đỉnh x khỏi đầu DS 3) Duyệt đỉnh x 4) Nạp đỉnh F(x) vào DS 5) Nếu DS quay lên bước 2) 6) Dừng 6.3 DUYỆT ĐỒ THỊ THEO CHIỀU SÂU Danh sách DS tổ chức theo kiểu stack (danh sách vào sau – trước – LIFO) Mỗi lần duyệt đỉnh ta duyệt đến tận nhánh chuyển sang duyệt nhánh khác VÍ DỤ 6.2 Thứ tự duyệt đỉnh đồ thị: 13 11 12 15 14 10 6.3 DUYỆT ĐỒ THỊ THEO CHIỀU SÂU (tiếp) Bắt đầu duyệt từ đỉnh x0 đồ thị Chọn x đỉnh kề x0 lặp lại trình duyệt đỉnh x Giả sử xét đỉnh x - Nếu tìm đỉnh y chưa duyệt xét đỉnh tiếp tục q trình duyệt - Nếu khơng cịn đỉnh kề với x chưa duyệt nói đỉnh x duyệt xong, quay trở lại tiếp tục duyệt từ đỉnh mà từ đến đỉnh x - Nếu quay trở lại đỉnh x0 phép duyệt kết thúc 10 VÍ DỤ 6.5 Đồ thị trình duyệt theo chiều rộng: 10 6.5 MỘT SỐ ỨNG DỤNG CỦA PHÉP DUYỆT ĐỒ THỊ Bài tốn đường Bài tốn tìm mảng liên thơng BÀI TOÁN ĐƯỜNG ĐI Cho G = (V, E) đồ thị vô hướng hai đỉnh a, b V Bài tốn: Tìm đường từ đỉnh a đến đỉnh b đồ thị G (nếu có) BÀI TỐN ĐƯỜNG ĐI (tiếp) Thuật tốn Warshall trả lời: có đường từ đỉnh a đến đỉnh b AS[a, b] = true Dùng phép duyệt đồ thị tìm đường (nếu có) từ đỉnh a đến đỉnh b BÀI TOÁN ĐƯỜNG ĐI (tiếp) Sau lời gọi thủ tục D_SAU(a) D_RONG(a) - Nếu Duyet[b] = false khơng có đường từ đỉnh a đên đỉnh b - Nếu Duyet[b] = true b thuộc mảng liên thơng với a có đường từ a đến b Dùng thêm biến mảng Truoc để khôi phục đường đi, Truoc [u] ghi đỉnh đến trước đỉnh u đường duyệt từ a tới u 10 BÀI TỐN ĐƯỜNG ĐI (tiếp) Sửa dịng lệnh thủ tục D_SAU(a) if ! Duyet [u] then begin Truoc [u] := v ; D_SAU(u) end ; Sửa dòng lệnh 11-15 thủ tục D_RONG (v): 11 if ! Duyet [u] then 12 begin 13 enqueue u into Q ; 14 Duyet [u] := true ; Truoc [u] := z 15 end ; 11 BÀI TỐN ĐƯỜNG ĐI (tiếp) Khơi phục đường cần tìm: b a1 = Truoc[b] a2 = Truoc[a1] a Đường tìm theo thuật toán duyệt theo chiều rộng đường ngắn từ đỉnh a đến đỉnh b 12 VÍ DỤ 6.6 Đồ thị q trình duyệt theo chiều rộng: 10 Đường từ 10: 10 13 BÀI TOÁN TÌM CÁC MẢNG LIÊN THƠNG Bài tốn: Tìm số mảng liên thông p đồ thị G xác định xem mảng liên thông bao gồm đỉnh 14 BÀI TỐN TÌM CÁC MẢNG LIÊN THƠNG (tiếp) Do thủ tục D_SAU(v) D_RONG(v) duyệt tất đỉnh thuộc mảng liên thông với đỉnh v nên số mảng liên thông p đồ thị G số lần gọi thủ tục D_SAU(v) D_RONG(v) Dùng thêm biến mảng Mang[v] ghi số mảng liên thông chứa v 15 BÀI TỐN TÌM CÁC MẢNG LIÊN THƠNG (tiếp) Dùng biến p đếm số mảng liên thông gán số cho mảng liên thơng tìm Khởi tạo: p := ; Thêm lệnh gán: Mang [v] := p ; thủ tục Thăm_đỉnh(v) 16 BÀI TỐN TÌM CÁC MẢNG LIÊN THƠNG (tiếp) Sửa lại chương trình thuật tốn duyệt: BEGIN { Chương trình } for v V Duyet [v] := false ; p := ; for v V if ! Duyet [v] then begin p := p + ; D_SAU (v) ; { D_RONG (v) ; } end END 17 BÀI TỐN TÌM CÁC MẢNG LIÊN THƠNG (tiếp) Khi kết thúc chương trình: Biến p cho số mảng liên thông Các giá trị Mang[v] , v V cho phép liệt kê tất đỉnh mảng liên thơng 18 VÍ DỤ 6.7 Xét đồ thị: 19 VÍ DỤ 6.7 (tiếp) Quá trình duyệt tìm mảng liên thơng: 20