Duyệt theo chiều sâu (DFS)
DFS — Depth-First Search (duyệt theo chiều sâu) chọn một nhánh và lao thật sâu tới khi cụt đường, rồi mới quay lui thử nhánh khác. Nó tự nhiên hợp với đệ quy (hoặc một stack thủ công), và là nền cho nhiều bài: thành phần liên thông, phát hiện chu trình, sắp xếp tô-pô.
1. Trực quan: đi trong mê cung
Tưởng tượng bạn lạc trong mê cung và áp dụng quy tắc "bám tường trái": cứ đi tới khi cụt đường, rồi lùi lại ngã rẽ gần nhất chưa thử và đi tiếp. Bạn đào sâu một hướng tới tận cùng trước khi quay lại — đó chính là DFS.
Bat dau tu A (uu tien con trai):
A
/ \
B C
/ \ \
D E F
Thu tu DFS: A -> B -> D (cut, lui)
-> E (cut, lui ve A)
-> C -> F
=> A B D E C F
So với BFS loang đều ra mọi hướng, DFS giống một mũi khoan: chọc sâu xuống một nhánh trước.
2. Cơ chế: đệ quy hoặc stack
DFS có hai cách cài đặt tương đương:
| Cách | Cấu trúc | Ghi chú |
|---|---|---|
| Đệ quy | Call stack ngầm | Ngắn gọn, dễ đọc |
| Vòng lặp | Stack thủ công | Tránh tràn stack khi đồ thị rất sâu |
Cả hai đều cần một tập visited để không thăm lại đỉnh cũ (nếu không sẽ lặp vô hạn trên chu trình).
3. Chạy debug: DFS đệ quy
4. Code chạy được
Hai bản: đệ quy và vòng lặp (stack thủ công). Kết quả cùng "tập đỉnh", chỉ khác thứ tự chi tiết.