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... - Nếu tìm được đỉnh y chưa được duyệt thì xét đỉnh nà
Trang 1CHƯƠNG 6
CÁC THUẬT TOÁN
DUYỆT ĐỒ THỊ
Trang 2NỘI DUNG
Các thuật toán duyệt đồ thị
Một số ứng dụng của các thuật toán duyệt đồ thị
Trang 36.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
Trang 4KHÁI NIỆM DUYỆT ĐỒ THỊ
Duyệt đồ thị là một cách liệt kê tất cả các đỉnh của
Trang 5Thứ tự duyệt: A, B, D, H, E, G, F, C
Trang 66.2 THUẬT TOÁN DUYỆT ĐỒ THỊ
Cho đồ thị G = (V, E) với x 0 là một đỉnh của G
Dùng một cấu trúc dữ liệu kiểu danh sách, kí hiệu là
DS, để chứa các đỉnh
Trang 76.2 THUẬT TOÁN DUYỆT ĐỒ THỊ (tiếp)
Trang 86.3 DUYỆT ĐỒ THỊ THEO CHIỀU SÂU
Danh sách DS được tổ chức theo kiểu stack (danh
sách vào sau – ra trước – LIFO).
Mỗi lần duyệt một đỉnh ta duyệt đến tận cùng mỗi
nhánh rồi mới chuyển sang duyệt nhánh khác
Trang 9VÍ DỤ 6.2
Thứ tự duyệt của các đỉnh trên đồ thị:
4 3
2
10
13 14
15
Trang 106.3 DUYỆT ĐỒ THỊ THEO CHIỀU SÂU (tiếp)
1 Bắt đầu duyệt từ một đỉnh x 0 nào đó của đồ thị
2 Chọn x là đỉnh kề nào đó của x0 và lặp lại quá trình
duyệt đối với đỉnh x Giả sử đang xét đỉnh x.
- Nếu tìm được đỉnh y chưa được duyệt thì xét đỉnh
này và bắt đầu từ đó tiếp tục quá trình duyệt
- Nếu không còn đỉnh kề với x chưa được duyệt thì nói rằng đỉnh x đã duyệt xong, quay trở lại tiếp
tục duyệt từ đỉnh mà từ đó đến được đỉnh x
- Nếu quay trở lại đúng đỉnh x 0 thì phép duyệt kếtthúc
Trang 116.3 DUYỆT ĐỒ THỊ THEO CHIỀU SÂU (tiếp)
Thuật toán 6.1 (Depth-First Search)
Dữ liệu: Biểu diễn mảng DK các danh sách kề của
đồ thị vô hướng G
Kết quả: Danh sách các đỉnh của đồ thị G.
Trang 126.3 DUYỆT ĐỒ THỊ THEO CHIỀU SÂU (tiếp)
Trang 136.3 DUYỆT ĐỒ THỊ THEO CHIỀU SÂU (tiếp)
Trang 146.3 DUYỆT ĐỒ THỊ THEO CHIỀU SÂU (tiếp)
Trang 156.3 DUYỆT ĐỒ THỊ THEO CHIỀU SÂU (tiếp)
Thuật toán cải tiến:
Trang 166.3 DUYỆT ĐỒ THỊ THEO CHIỀU SÂU (tiếp)
Trang 186.4 DUYỆT ĐỒ THỊ THEO CHIỀU RỘNG
Danh sách DS được tổ chức theo kiểu hàng đợi (danh
sách vào trước - ra trước – FIFO).
- Việc duyệt có tính chất “lan rộng”
- Đỉnh được duyệt xong ngay sau khi ta đã xét hết tất cả các đỉnh kề với nó
- Đỉnh được xét càng sớm thì sớm trở thành duyệt xong
Trang 191 2
1 3
1 5 1
2
Trang 206.4 DUYỆT ĐỒ THỊ THEO CHIỀU RỘNG (tiếp)
Thuật toán 6.3 (Breadth-First Search )
Trang 216.4 DUYỆT ĐỒ THỊ THEO CHIỀU RỘNG (tiếp)
Trang 226.4 DUYỆT ĐỒ THỊ THEO CHIỀU RỘNG (tiếp)
Trang 246.5 MỘT SỐ ỨNG DỤNG CỦA PHÉP DUYỆT ĐỒ THỊ
Bài toán đường đi
Bài toán tìm các mảng liên thông
Trang 25BÀI TOÁN ĐƯỜNG ĐI
Cho G = (V, E) là một đồ thị vô hướng và hai đỉnh a,
b V.
Bài toán: Tìm đường đi từ đỉnh a đến đỉnh b trên đồ thị G (nếu có).
Trang 26BÀI TOÁN ĐƯỜNG ĐI (tiếp)
1 Thuật toán Warshall đã trả lời:
có đường đi từ đỉnh a đến đỉnh b AS[a, b] = true.
2 Dùng phép duyệt đồ thị tìm đường đi (nếu có) từ
đỉnh a đến đỉnh b.
Trang 27BÀI TOÁN ĐƯỜNG ĐI (tiếp)
Sau lời gọi thủ tục D_SAU(a) hoặc D_RONG(a)
- Nếu Duyet[b] = false thì không có đường đi từ
đỉnh a đên đỉnh b.
- Nếu Duyet[b] = true thì b thuộc cùng mảng liên thông với a và có đường đi từ a đến b
Dùng thêm một biến mảng Truoc để khôi phục đường
đi, Truoc [u] ghi đỉnh đến trước đỉnh u trên đường
Trang 28BÀI TOÁN ĐƯỜNG ĐI (tiếp)
Sửa dòng lệnh 6 trong thủ tục D_SAU(a)
6 if ! Duyet [u] then
begin Truoc [u] := v ; D_SAU(u) end ;
Sửa các dòng lệnh 11-15 trong thủ tục D_RONG (v):
11 if ! Duyet [u] then
14 Duyet [u] := true ; Truoc [u] := z
15 end ;
Trang 29BÀI TOÁN ĐƯỜNG ĐI (tiếp)
Khôi phục đường đi cần tìm:
b a 1 = Truoc[b] a 2 = Truoc[a 1 ] a
Đường đi tìm được theo thuật toán duyệt theo chiều
rộng là đường đi ngắn nhất từ đỉnh a đến đỉnh b.
Trang 31BÀI TOÁN TÌM CÁC MẢNG
LIÊN THÔNG
Bài toán: Tìm số mảng liên thông p của đồ thị G và
xác định xem mỗi mảng liên thông bao gồm nhữngđỉnh nào
Trang 32BÀI TOÁN TÌM CÁC MẢNG
LIÊN THÔNG (tiếp)
Do thủ tục D_SAU(v) hoặc D_RONG(v) duyệt tất
cả các đỉnh thuộc cùng mảng liên thông với đỉnh v nên
số mảng liên thông p của đồ thị G bằng số lần gọi các thủ tục D_SAU(v) hoặc D_RONG(v).
Dùng thêm biến mảng Mang[v] ghi chỉ số của mảng liên thông chứa v.
Trang 33BÀI TOÁ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 và gán chỉ số
cho các mảng liên thông tìm được
1 Khởi tạo: p := 0 ;
2 Thêm lệnh gán: Mang [v] := p ; trong thủ tục
Thăm_đỉnh(v).
Trang 34BÀI TOÁN TÌM CÁC MẢNG
LIÊN THÔNG (tiếp)
Sửa lại chương trình chính của thuật toán duyệt:
Trang 35BÀI TOÁ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
cả các đỉnh trong từng mảng liên thông
Trang 364
3
Trang 37VÍ DỤ 6.7 (tiếp)
Quá trình duyệt và tìm các mảng liên thông: