DUYỆT ĐỒ THỊ THEO CHIỀU RỘNG
Chia sẻ bởi Nguyễn Việt Vương |
Ngày 02/05/2019 |
137
Chia sẻ tài liệu: DUYỆT ĐỒ THỊ THEO CHIỀU RỘNG thuộc Bài giảng khác
Nội dung tài liệu:
6.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.
VÍ DỤ 6.4
Duyệt đồ thị theo chiều rộng:
7
3
5
6
10
11
12
13
15
1
2
14
8
9
4
6.4. DUYỆT ĐỒ THỊ THEO CHIỀU RỘNG (tiếp)
Thuật toán 6.3 (Breadth-First Search )
1 procedure D_RONG (v) ;
2 begin
3 Q := ;
enqueue v into Q ; { Nạp v vào cuối
hàng đợi Q }
5 Duyet [v] := true ;
6 while Q do
7 begin
dequeue z from Q ; { Loại z ra khỏi
đầu hàng đợi Q}
6.4. DUYỆT ĐỒ THỊ THEO CHIỀU RỘNG (tiếp)
9 Thăm_đỉnh (z) ;
10 for u DK[z] do
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 chính }
19 for v V do Duyet [v] := false ;
20 for v V do
21 if ! Duyet [v] then D_RONG (v) ;
22 END .
Độ phức tạp: O(n+m).
VÍ DỤ 6.5
Đồ thị và quá trình duyệt theo chiều rộng:
1
2
5
8
3
6
4
7
9
10
6.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
BÀ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ó).
BÀ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.
BÀ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 duyệt từ a tới u.
BÀ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
12 begin
13 enqueue u into Q ;
14 Duyet [u] := true ; Truoc [u] := z
15 end ;
BÀI TOÁN ĐƯỜNG ĐI (tiếp)
Khôi phục đường đi cần tìm:
b 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.
VÍ DỤ 6.6
Đồ thị và quá trình duyệt theo chiều rộng:
Đường đi từ 1 10: 10 9 6 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.
1
2
4
3
5
6
7
8
9
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.
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 và gán chỉ số cho các mảng liên thông tìm được.
Khởi tạo: p := 0 ;
Thêm lệnh gán: Mang [v] := p ; trong thủ tục Thăm_đỉnh(v).
BÀ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:
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 .
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.
VÍ DỤ 6.7
Xét đồ thị:
VÍ DỤ 6.7 (tiếp)
Quá trình duyệt và tìm các mảng liên thô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.
VÍ DỤ 6.4
Duyệt đồ thị theo chiều rộng:
7
3
5
6
10
11
12
13
15
1
2
14
8
9
4
6.4. DUYỆT ĐỒ THỊ THEO CHIỀU RỘNG (tiếp)
Thuật toán 6.3 (Breadth-First Search )
1 procedure D_RONG (v) ;
2 begin
3 Q := ;
enqueue v into Q ; { Nạp v vào cuối
hàng đợi Q }
5 Duyet [v] := true ;
6 while Q do
7 begin
dequeue z from Q ; { Loại z ra khỏi
đầu hàng đợi Q}
6.4. DUYỆT ĐỒ THỊ THEO CHIỀU RỘNG (tiếp)
9 Thăm_đỉnh (z) ;
10 for u DK[z] do
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 chính }
19 for v V do Duyet [v] := false ;
20 for v V do
21 if ! Duyet [v] then D_RONG (v) ;
22 END .
Độ phức tạp: O(n+m).
VÍ DỤ 6.5
Đồ thị và quá trình duyệt theo chiều rộng:
1
2
5
8
3
6
4
7
9
10
6.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
BÀ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ó).
BÀ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.
BÀ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 duyệt từ a tới u.
BÀ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
12 begin
13 enqueue u into Q ;
14 Duyet [u] := true ; Truoc [u] := z
15 end ;
BÀI TOÁN ĐƯỜNG ĐI (tiếp)
Khôi phục đường đi cần tìm:
b 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.
VÍ DỤ 6.6
Đồ thị và quá trình duyệt theo chiều rộng:
Đường đi từ 1 10: 10 9 6 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.
1
2
4
3
5
6
7
8
9
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.
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 và gán chỉ số cho các mảng liên thông tìm được.
Khởi tạo: p := 0 ;
Thêm lệnh gán: Mang [v] := p ; trong thủ tục Thăm_đỉnh(v).
BÀ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:
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 .
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.
VÍ DỤ 6.7
Xét đồ thị:
VÍ DỤ 6.7 (tiếp)
Quá trình duyệt và tìm các mảng liên thông:
* Một số tài liệu cũ có thể bị lỗi font khi hiển thị do dùng bộ mã không phải Unikey ...
Người chia sẻ: Nguyễn Việt Vương
Dung lượng: |
Lượt tài: 3
Loại file:
Nguồn : Chưa rõ
(Tài liệu chưa được thẩm định)