BÀI 12
6.1.3. Duyt theo chiu rng (Breadth-First Search)
Nếu trong thut toán duyt đồ th, cu trúc danh sách DS được t chc theo
kiu hàng đợi (danh sách vào trước - ra trước – FIFO ) thì ta có phương pháp
duyt theo chiu rng. Trong phương pháp này vic duyt có tính cht “lan rng”.
Mt đỉnh được duyt xong ngay sau khi ta đã xét hết tt c các đỉnh k vi nó. Đỉnh
được xét càng sm thì sm tr thành duyt xong.
Thut toán 6.3 (Duyt đồ th theo chiu rng):
D liu: Biu din mng DK các danh sách k ca đồ th vô hướng G.
Kết qu: Danh sách các đỉnh ca đồ th G.
1 procedure D_RONG (v) ;
2 begin
3 Q := ;
4 enqueue v into Q ; { Np v vào cui hàng đợi Q }
5 Duyet [v] := true ;
6 while Q do
7 begin
8 dequeue z from Q ; { Loi z ra khi đầu hàng đợi Q }
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 ;
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 .
Thut toán này cũng có độ phc tp là: O(n+m)
Ví d 6.2: Đồ th trong Ví d 6.1 được duyt theo chiu rng.
Hình 6.2. Th t ca các đỉnh được duyt theo chiu rng
6.2. Mt s ng dng ca thut toán duyt đồ th
6.2.1. Bài toán tìm đường đi
Gi s ab là hai đỉnh nào đó ca đồ th vô hướng G. Hãy tìm đường đi
(nếu có) t đỉnh a đến đỉnh b.
Bài toán này đã được gii quyết bng Thut toán 1.4 hoc thut toán Warshall.
Theo các phương pháp duyt đồ th, các li gi th tc D_SAU(a) hoc
D_RONG(a) cho phép thăm tt c các đỉnh thuc cùng thành phn liên thông vi
đỉnh a. Vì vy, sau khi thc hin xong th tc nếu Duyet[b] = false thì không có
đường đi t đỉnh a đên đỉnh b ngược li thì đỉnh b thuc cùng mng liên thông
vi đỉnh a, hay nói mt cách khác, có đường đi t a đến b.
Để khôi phc đường đi ta dùng thêm mt biến mng Truoc. Thành phn
Truoc [u] ghi li đỉnh đến trước đỉnh u trên đường duyt t a ti u. Khi đó, trong
th tc D_SAU (v) cn sa đổi câu lnh if dòng lnh 6 như sau:
6 if ! Duyet [u] then begin Truoc [u] := v ; D_SAU(u) end ;
còn trong th tc D_RONG (v) thì cn sa câu lnh if các dòng lnh 11-15 là:
11 if ! Duyet [u] then
12 begin
13 enqueue u into Q ;
14 Duyet [u] := true ; Truoc [u] := z
15 end ;
Đường đi cn tìm (nếu có) s được khôi phc như sau:
b
a1 = Truoc[b] a2 = Truoc[a1] . . . . a
Chú ý: Đường đi tìm được theo thut toán duyt theo chiu rng là đường đi ngn
nht t đỉnh a đến đỉnh b.
6.2.2. Bài toán tìm các mng liên thông
Cho đồ th G, hãy tìm s mng liên thông p ca đồ th này và xác định xem
mi mng liên thông bao gm nhng đỉnh nào.
Do các th tc D_SAU(v) hoc D_RONG(v) cho phép duyt tt c các đỉnh
thuc cùng mng liên thông vi đỉnh v nên s mng liên thông p ca đồ th G
chính bng s ln gi đến các th tc này trong chương trình chính.
Để ghi nhn các đỉnh trong tng mng liên thông, ta dùng thêm biến mng
Mang[v] để ghi ch s ca mng liên thông cha đỉnh v. Ch s này tăng t 1 đến p.
Ta dùng biến p để đếm s mng liên thông ca đồ th và gán ch s cho các
mng liên thông tìm được. Bt đầu nó được khi to giá tr bng 0. Th tc
Thăm_đỉnh(v) trong các th tc D_SAU(v) và D_RONG(v) làm thêm nhim v
gán:
Mang [v] := p ;
Còn chương trình chính ca thut toán duyt cn được sa li như sau:
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 .
Khi chương trình kết thúc, biến p s cho s mng liên thông ca đồ th còn
các giá tr ca biến mng Mang[v] , v V cho phép lit kê tt c các đỉnh trong
tng mng liên thông ca đồ th.