Duyệt theo chiều rộng (BFS)
BFS — Breadth-First Search (duyệt theo chiều rộng) thăm đồ thị theo từng lớp: gần trước, xa
sau. Nhờ vậy nó tìm được đường đi ngắn nhất theo số cạnh trên đồ thị không trọng số. Trái tim
của BFS là một hàng đợi (queue) và một tập visited.
1. Trực quan: vết dầu loang
Hãy tưởng tượng bạn nhỏ một giọt mực vào mặt nước tại đỉnh xuất phát. Mực lan đều ra mọi hướng: trước tiên thấm tới tất cả các đỉnh cách 1 bước, rồi mới tới những đỉnh cách 2 bước, rồi 3 bước... Đó chính là BFS: nó phủ hết một lớp rồi mới sang lớp tiếp theo.
Bat dau tu A:
lop 0: A
/ \
lop 1: B C
/| |
lop 2: D E F
Thu tu tham: A B C D E F
(gan -> xa, het lop nay moi sang lop sau)
Vì luôn xử lý đỉnh gần nhất trước, lần đầu tiên chạm tới một đỉnh cũng chính là con đường ngắn nhất (ít cạnh nhất) tới đỉnh đó.
2. Cơ chế: queue và visited
BFS dùng hàng đợi FIFO (vào trước ra trước) để đảm bảo lớp gần được lấy
ra trước lớp xa. Đồ thị lưu bằng danh sách kề — một dict
ánh xạ mỗi đỉnh sang danh sách hàng xóm.
| Bước | Hành động |
|---|---|
| Khởi tạo | Cho đỉnh nguồn vào queue, đánh dấu visited |
| Lặp | Lấy đỉnh đầu queue ra, duyệt hàng xóm |
| Mở rộng | Hàng xóm nào chưa thăm thì đánh dấu và đẩy vào queue |
Đánh dấu visited ngay lúc đưa vào queue. Nếu đợi tới lúc lấy ra mới đánh dấu, một đỉnh có thể bị
đẩy vào queue nhiều lần → sai và chậm.
3. Chạy debug: BFS từng bước
4. Code chạy được
Dùng collections.deque để popleft() đạt O(1) (nếu dùng list.pop(0) sẽ là O(n)).
5. Phân tích
| Khía cạnh | Giá trị |
|---|---|
| Thời gian | O(V + E) — mỗi đỉnh và mỗi cạnh xét đúng một lần |
| Bộ nhớ | O(V) — cho queue và tập visited |
| Tìm đường ngắn nhất | Đúng trên đồ thị không trọng số |
Bẫy thường gặp:
- Quên
visited→ lặp vô hạn trên đồ thị có chu trình. - Dùng
list.pop(0)thay vìdeque→ tụt xuống O(V²). - Đánh dấu lúc lấy ra thay vì lúc đẩy vào → một đỉnh vào queue nhiều lần.
6. Mẫu nhận diện
- "Đường đi ngắn nhất trên lưới / đồ thị không trọng số" → BFS.
- "Tìm theo từng lớp", "ít bước nhất", "số nước cờ tối thiểu" → BFS.
- "Lan toả", "vùng liên thông gần nhất", loang trên bàn cờ → BFS.
7. 🎮 Trò chơi: Hiểu BFS
8. Quiz kiểm tra nhanh
9. Hoàn thành
…☑️ Tiếp theo: 3.3.2 — Duyệt theo chiều sâu (DFS) (lao thật sâu rồi quay lui).