Quá trình duyệt theo chiều rộng cũng bắt đầu từ một đỉnh nào đó của đồ thị. Tiếp đến, các đỉnh kề của nó sẽ đƣợc thăm, rồi tiếp tục đến các đỉnh kề của các đỉnh vừa thăm .v.v.
Nhƣ vậy, quá trình duyệt theo chiều rộng không duyệt theo từng “nhánh” của đồ thị mà duyệt theo độ sâu của các đỉnh so với đỉnh ban đầu. Từ đỉnh bắt đầu, các đỉnh có khoảng cách với đỉnh ban đầu là 1 đƣợc duyệt, tiếp đến là các đỉnh có khoảng cách 2, v.v.
Hình 6.9 Duyệt đồ thị theo chiều rộng
Ví dụ, vẫn với đồ thị nhƣ ở phần trƣớc, quá trình duyệt theo chiều rộng với đỉnh bắt đầu là a sẽ cho thứ tự duyệt nhƣ sau:
- Sau khi thăm đỉnh a, tiến hành thăm các đỉnh kề với a là b và c. - Tiếp theo, thăm các đỉnh kề với b là d.
- Đỉnh kề với c là b đã đƣợc thăm rồi nên bỏ qua. Nhƣ vậy, thứ tự các đỉnh đƣợc thăm là: a, b, c, d.
Duyệt theo chiều rộng có thể đƣợc cài đặt không đệ qui bằng cách sử dụng hàng đợi để lƣu các đỉnh cần đƣợc thăm. Các bƣớc nhƣ sau:
Đầu tiên, đƣa đỉnh bắt đầu v vào hàng đợi, sau đó lặp lại quá trình sau cho đến khi hàng đợi không còn phần tử nào:
- Lấy phần tử ra khỏi hàng đợi, đƣa vào biến v. - Thăm đỉnh v.
- Với mỗi đỉnh kề với v, nếu đỉnh này chƣa đƣợc thăm thì đƣa vào hàng đợi. Ví dụ, đối với đồ thị ở hình … ở trên, các bƣớc thực hiện nhƣ sau:
Đầu tiên, đƣa đỉnh a vào hàng đợi.
b a
- Lấy đỉnh a ra khỏi hàng đợi, thăm đỉnh a.
- Đƣa 2 đỉnh kề với a là b và c vào hàng đợi.
- Lấy đỉnh b ra khỏi hàng đợi, thăm đỉnh b
- Đƣa đỉnh kề với b là d vào hàng đợi
- Lấy đỉnh c ra khỏi hàng đợi, thăm đỉnh c
- Đỉnh kề với c là b đã thăm, vì vậy không đƣa vào hàng đợi. Lấy đỉnh d ra khỏi hàng đơi, thăm đỉnh d.
- Hàng đợi hết phần tử, quá trình duyệt kết thúc. Thứ tự thăm các đỉnh là: a, b, c, d Cài đặt cho thuận toán duyệt theo chiều rộng nhƣ sau:
void BreadthFirstSearch(int v){ queue = ;
Đưa v vào hàng đợi; daxet[v] = 1;
while (queue ){
Lấy phần tử ra khỏi hàng đợi, đưa vào biến u; Thăm đỉnh u;
for mỗi đỉnh w kề với u { if (daxet[w]=0 ) {
Đưa w vào hàng đợi; daxet[w] = 1; } } } a b c c c d d
Tƣơng tự nhƣ duyệt theo chiều sâu, thủ tục BreadthFirstSearch sẽ thăm tất cả các đỉnh cùng thành phần liên thông với v. Để thăm tất cả các đỉnh của đồ thị, chúng ta chỉ cần thực hiện:
for( v=1; vn; v++) daxet[v] = 0; for(v=1; vn; v++)
if (daxet[v]=0)
BreadthFirstSearch(u);