Thông tin tài liệu
6.4 DUYỆT ĐỒ THỊ THEO CHIỀU RỘNG Danh sách DS tổ chức theo kiểu hàng đợi (danh sách vào trước - trước – FIFO) - Việc duyệt có tính chất “lan rộng” - Đỉnh duyệt xong sau ta xét hết tất đỉnh kề với - Đỉnh xét sớm sớm trở thành duyệt xong VÍ DỤ 6.4 Duyệt đồ thị theo chiều rộng: 1 1 14 6.4 DUYỆT ĐỒ THỊ THEO CHIỀU RỘNG (tiếp) Thuật toán 6.3 (Breadth-First Search ) procedure D_RONG (v) ; begin Q := ∅ ; enqueue v into Q ; { Nạp v vào cuối hàng đợi Q } Duyet [v] := true ; while Q ≠ ∅ begin dequeue z from Q ; { Loại z khỏi đầu hàng đợi Q} 6.4 DUYỆT ĐỒ THỊ THEO CHIỀU RỘNG (tiếp) Thăm_đỉnh (z) ; 10 for u ∈ DK[z] 11 if ! Duyet [u] then 12 begin 13 enqueue u into Q ; 14 Duyet [u] := true 15 end 16 end 17 end ; 6.4 DUYỆT ĐỒ THỊ THEO CHIỀU RỘNG (tiếp) 18 BEGIN {Chương trình } 19 for v ∈ V Duyet [v] := false ; 20 for v ∈ V 21 if ! Duyet [v] then D_RONG (v) ; 22 END Độ phức tạp: O(n+m) 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 toán đường Bài toá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 toán: Tìm đường từ đỉnh a đến đỉnh b đồ thị G (nếu có) BÀI TOÁN ĐƯỜNG ĐI (tiếp) Thuật toá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 đườ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 TOÁ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 TOÁ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ị 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 toá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 TOÁ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 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 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 TOÁN TÌM CÁC MẢNG LIÊN THÔNG (tiếp) Sửa lại chương trình thuật toá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 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 đỉ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 [...]... ← a1 = Truoc[b] ← a2 = Truoc[a1] ← ← 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 12 VÍ DỤ 6.6 Đồ thị và quá trình duyệt theo chiều rộng: 5 2 8 1 6 3 9 4 7 10 Đường đi từ 1 → 10: 10 ← 9 ← 6 ← 13 2 ← 1 BÀ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... và xác định xem mỗi mảng liên thông bao gồm những đỉnh nào 2 1 6 4 5 8 7 9 3 14 BÀ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 15 BÀI TOÁN TÌM CÁC MẢNG LIÊN THÔNG... toán duyệt: 1 BEGIN { Chương trình chính } 2 for v ∈ V do Duyet [v] := false ; 3 p := 0 ; 4 for v ∈ V do 5 if ! Duyet [v] then 6 begin p := p + 1 ; 7 D_SAU (v) ; { D_RONG (v) ; } 8 end 9 END 17 BÀ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 18 VÍ DỤ 6.7 Xét đồ. .. (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 18 VÍ DỤ 6.7 Xét đồ thị: 2 1 6 4 5 8 7 9 3 19 VÍ DỤ 6.7 (tiếp) Quá trình duyệt và tìm các mảng liên thông: 20 ...VÍ DỤ 6.4 Duyệt đồ thị theo chiều rộng: 1 1 14 6.4 DUYỆT ĐỒ THỊ THEO CHIỀU RỘNG (tiếp) Thuật toán 6.3 (Breadth-First Search ) procedure... 6.4 DUYỆT ĐỒ THỊ THEO CHIỀU RỘNG (tiếp) Thăm_đỉnh (z) ; 10 for u ∈ DK[z] 11 if ! Duyet [u] then 12 begin 13 enqueue u into Q ; 14 Duyet [u] := true 15 end 16 end 17 end ; 6.4 DUYỆT ĐỒ THỊ THEO CHIỀU... ← 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ị trình duyệt theo chiều rộng: 10 Đường từ → 10: 10 ← ← ← 13 ← BÀI
Ngày đăng: 29/12/2015, 22:10
Xem thêm: DUYỆT đồ THỊ THEO CHIỀU RỘNG, DUYỆT đồ THỊ THEO CHIỀU RỘNG