Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 20 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
20
Dung lượng
117 KB
Nội dung
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