TOP Trong khi giải nhiều băi toân được mô hình hóa bằng đồ thị, ta cần đi qua câc cung vă câc cạnh của đồ thị một câch có hệ thống (theo một thứ tự quy ước năo đó). Có 2 phĩp duyệt phổ biến đó lă duyệt theo chiều sđu, tương tự như duyệt tiền tự một cđy vă duyệt theo chiều rộng, tương tự như phĩp duyệt theo mức.
1. Duyệt theo chiều sđu ( Depth - first search ) TOP
Giả sử ta có một đồ thị G với câc đỉnh ban đầu được đânh dấu lă chưa duyệt (Unvisited). Từ một đỉnh v năo đó ta bắt đầu duyệt như sau : Ðânh dấu v đê duyệt, với mỗi đỉnh w kề với v chưa được duyệt, ta thực hiện đệ quy quâ trình trín cho w. Câch duyệt năy được gọi lă duyệt theo chiều sđu vì nó sẽ duyệt theo một hướng năo đó sđu nhất có thể được. Giải thuật duyệt theo chiều sđu một đồ thị có thể được trình băy như sau (trong đó ta dùng một mảng mark có n phần tử để đânh dấu câc đỉnh của đồ thị lă đê duyệt hay chưa ) .
{ Ðânh dấu chưa duyệt tất cả câc đỉnh }
For i :=1 to n do
Mark [i] := Unvisited ;
{ Duyệt theo chiều sđu từ đỉnh đânh số 1 } For i :=1 to n do
If Mark [i] = Unvisited then Dfs (i) ;
Ví dụ : Duyệt theo chiều sđu bắt đầu từ đỉnh A của đồ thị saụ Ta bắt đầu duyệt từ đỉnh A tức lă Dfs (A). Giải thuật sẽ đânh dấu lă A đê được duyệt rồi chọn đỉnh đầu tiín trong danh sâch câc đỉnh kề với đỉnh A, đó lă đỉnh G, G có 2 đỉnh kề với nó lă B vă C, theo thứ tự đó thì đỉnh kế tiếp sẽ được duyệt lă đỉnh B. B có một đỉnh kề với nó lă đỉnh A nhưng đỉnh A đê được duyệt nín phĩp duyệt Dfs (B) được hoăn tất. Bđy giờ giải thuật sẽ tiếp tục với đỉnh kề với G chưa được duyệt đó lă đỉnh C. C không
có đỉnh kề do đó phĩp duyệt Dfs (C) kết thúc vậy Dfs (A) cũng kết thúc. Còn lại 3 đỉnh chưa duyệt lă D, E, F vă theo thứ tự đó thì D được duyệt, tiếp theo lă F. Phĩp duyệt Dfs (D) kết thúc vă còn lại một đỉnh E chưa được duyệt. Tiếp tục duyệt E vă kết thúc. Nếu ta in câc đỉnh của đồ thị theo thứ tự được duyệt ta sẽ có danh sâch sau : AGBCDFẸ
Thủ tục DFS theo giải thuật được trình băy có thể được viết như sau :
Procedure DFS ( v : vertex ) ;
Var w : Vertex ; Begin
Mark [v] : = Visited ;
For ( Mỗi đỉnh w kề với đỉnh v ) do If Mark (w) = Unvisited then
Dfs (w) ; End ;
Ví dụ : Duyệt theo chiều sđu đồ thị hình sau :
Giả sử ta bắt đầu duyệt từ đỉnh Ạ A có 3 đỉnh kề lă B, C, D ; theo thứ tự đó thì B sẽ được duyệt. B có một đỉnh kề lă F nín F được duyệt. F có câc đỉnh kề chưa duyệt lă D vă G ; theo thứ tự đó thì D được duyệt. D có câc đỉnh kề chưa duyệt lă C, E, G ; theo thứ tự đó thì C được duyệt. Tất cả câc đỉnh kề với C đê được duyệt nín giải thuật sẽ tiếp tục duyệt đến đỉnh Ẹ E có đỉnh kề chưa được duyệt lă đỉnh G. Vậy ta duyệt G. Lúc năy tất cả câc đỉnh của đồ thị đê được duyệt xong. Ta có thứ tự câc đỉnh được duyệt lă : ABFDCEG.
2. Duyệt theo chiều rộng ( Breadth - First Search )
TOP Giả sử ta có một đồ thị G với câc đỉnh ban đầu được đânh dấu lă chưa duyệt (Unvisited). Từ một đỉnh v năo đó ta bắt đầu duyệt như sau : Ðânh dấu v đê duyệt, kế đến lă duyệt tất cả câc đỉnh kề với v. Khi ta duyệt một đỉnh v rồi đến đỉnh w thì câc đỉnh kề của v được duyệt trước câc đỉnh kề của w, vì vậy ta sẽ dùng một hăng để lưu trữ câc nút theo thứ tự được duyệt để có thể duyệt tất cả câc đỉnh kề với chúng. Ta cũng dùng mảng một chiều Mark để đânh dấu một đỉnh lă đê được duyệt hay chưạ Tương tự như phĩp duyệt theo chiều sđụ Giải thuật duyệt theo chiều rộng có thể được viết như sau :
{ Ðânh dấu chưa duyệt tất cả câc đỉnh }
Mark [i] := Unvisited ;
{ Duyệt theo chiều rộng từ đỉnh đânh số 1 } For i :=1 to n do
If Mark [i] = Unvisited then Bfs (i) ;
Thủ tục BFS theo giải thuật được trình băy có thể được viết như sau :
Procedure BFS ( v : vertex ) ;
Var Q : Queue of Vertex ; x, y : Vertex ;
Begin
Mark [v] : = Visited ; EnQueue (v, Q) ;
While Not EmptyQueue (Q) do Begin
x := Front (Q) ; DeQueue (Q) ;
For ( Mỗi đỉnh y kề với đỉnh x ) do If Mark (y) = Unvisited then
Begin
Mark (y) := visited ; EnQueue (y, Q) ; End ;
End ; End ;
Ví dụ : Duyệt theo chiều rộng bắt đầu từ đỉnh A của đồ thị trong ví dụ đầu tiín của phĩp duyệt theo chiều sđụ Ta bắt đầu từ Ạ A chỉ có một đỉnh kề lă G nín ta duyệt G. Tiếp theo duyệt tất cả câc đỉnh kề của G lă C, B. Tiếp theo duyệt tất cả câc đỉnh kề với C, B theo thứ tự đó. Câc đỉnh kề với C vă B đều đê được duyệt, nín ta tiếp tục duyệt câc đỉnh chưa được duyệt. Câc đỉnh chưa đwợc duyệt lă D, E, F. Ta duyệt D, tiếp đến lă F vă cuối cùng lă Ẹ Vậy thứ tự câc đỉnh được duyệt sẽ lă: ĂGCBDẸ
Tiếp theo ta sẽ sử dụng phĩp duyệt theo chiều rộng để duyệt đồ thị kế tiếp. Bắt đầu duệt từ đỉnh A, tiếp thío duyệt tất cả câc đỉnh kề với đỉnh A đó lă B, C, D theo thứ tự đó. Tiếp đến lă duyệt tất cả câc đỉnh kề với B, C, D theo đúng thứ tự đó lă F, E, G. Có thể minh họa hoạt động của hăng trong phĩp duyệt trín như sau :
Ðầu tiín ta duyệt nút A vă đưa A văo hăng A
Tiếp theo duyệt tất cả câc đỉnh kề với A mă chưa được duyệt đó lă B, C, D. Xóa đỉnh A khỏi hăng vă đưa câc đỉnh B, C, D văo hăng đợi :
B C D
Kế đến B được lấy ra khỏi hăng vă câc đỉnh kề với B mă chưa được duyệt đó lă F vă F được đưa văo hăng :
C D F
C được lấy ra khỏi hăng vă câc đỉnh kề với C mă chưa được duyệt thì sẽ được duyệt . Không có đỉnh năo như vậy nín bước năy không có thím đỉnh năo được duyệt vă trạng thâi của hăng đợi như sau :
D
F
Tiếp theo D được lấy ra khỏi hăng vă duyệt câc đỉnh kề chưa duyệt của D lă E, G. Sau đó E, G được đưa văo hăng đợi :
F E G
Tiếp tục F được lấy ra khỏi hăng. Không có đỉnh kề năo với F chưa được duyệt. Vậy không duyệt thím đỉnh năọ Tương tự ta tiếp tục duyệt E rồi đến G. Sau khi duyệt xong thì hăng đợi trở nín rỗng vă giải thuật kết thúc.