BÀI 11
Chương 6
Các thut toán duyt đồ th
Phép duyt đồ th là mt cách lit kê tt c các đỉnh ca đồ th này thành mt
danh sách tuyến tính. Hay nói mt cách khác, phép duyt đồ th cho ta mt cách “đi
qua” tt c các đỉnh ca đồ th để truy nhp, thêm bt thông tin các đỉnh ca đồ
th đó.
Phép duyt đồ th không ph thuc vào hướng ca các cnh. Do vy, vi đồ
th có hướng thì ta vô hướng hoá trước khi duyt.
6.1. Các thut toán duyt đồ th
6.1.1. Thut toán duyt đồ th
Gi s G = (V, E) là đồ th đã cho và x0 là mt đỉnh nào đó ca G. Ký hiu DS
là mt cu trúc d liu kiu danh sách dùng để cha các đỉnh.
1) Khi đầu: DS {x0}
2) Ly đỉnh x ra khi đầu DS
3) Duyt đỉnh x
4) Np các đỉnh ca F(x) vào DS
5) Nếu DS thì quay lên bước 2)
6) Dng
6.1.2. Duyt theo chiu sâu (Depth-First Search)
Nếu trong thut toán trên, danh sách DS được t chc theo kiu stack (danh
sách vào sau - ra trước – LIFO) thì ta có phương pháp duyt theo chiu sâu.
Trong phương pháp này mi ln duyt mt đỉnh ta duyt đến tn cùng mi
nhánh ri mi chuyn sang duyt nhánh khác.
Gi s G = (V, E) là mt đồ th vô hướng.
Ta bt đầu duyt t mt đỉnh x0 nào đó ca đồ th. Sau đó chn xđỉnh k
nào đó ca x0 và lp li quá trình duyt đối vi đỉnh x.
Gi s ta đang xét đỉnh x. Nếu trong s các đỉnh k vi x, ta tìm được đỉnh y
chưa được duyt thì ta s xét đỉnh này và bt đầu t đó ta tiếp tc quá trình duyt.
Ngược li, nếu không còn đỉnh nào k vi x chưa được duyt thì ta nói rng đỉnh
x đã duyt xong và quay tr li tiếp tc duyt t đỉnh mà t đó ta đến được đỉnh x.
Nếu quay tr li đúng đỉnh x0 thì phép duyt kết thúc.
Thut toán 6.1 (Duyt đồ th theo chiu sâu):
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_SAU (v) ;
2 begin
3 Thăm_đỉnh (v) ;
4 Duyet [v] := true ;
5 for u DK[v] do
6 if ! Duyet [u] then D_SAU (u) ;
7 end ;
8 BEGIN { Chương trình chính }
9 for v V do Duyet [v] := false ;
10 for v V do
11 if ! Duyet [v] then D_SAU (v) ;
12 END.
Độ phc tp ca tht toán là: O(n+m)
Ví d 6.1: Đồ th được duyt theo chiu sâu.
Hình 6.1. Th t ca các đỉnh được duyt theo chiu sâu
Trong thut toán duyt theo chiu sâu, đỉnh được thăm càng mun càng sm
tr thành duyt xong. Do vy vic dùng mt ngăn xếp (stack) để lưu tr các đỉnh
đang duyt là rt thích hp. Ta có th tc ci tiến sau đây:
Thut toán 6.2 (Duyt đồ th theo chiu sâu):
1 procedure D_SAU_2 (v) ;
2 begin
3 S := ;
4 Thăm_đỉnh (v) ;
5 Duyet [v] := true ;
6 push v onto S ; { Np v lên đỉnh ca S }
7 while S do
8 begin
9 while u DK[top(S)] do
10 if ! Duyet [u] then
11 begin
12 Thăm_đỉnh (u) ;
13 Duyet [u] := true ;
14 push u onto S ;
15 end ;
16 pop(S) ; { Loi b phn t đỉnh ca S }
17 end ;
18 end ;