btvn.vn
Tìm kiếm Đăng nhập

Duyệt theo chiều sâu bằng đệ quy

Lưu trên thiết bị này
Chuyên đề lựa chọn CS: Duyệt đồ thị · Chọn bài khác

Đi hết một nhánh trước khi đổi nhánh

DFS (Depth First Search) bắt đầu ở s, đánh dấu s rồi xét các đỉnh kề. Gặp đỉnh chưa thăm thì duyệt sâu từ đỉnh đó; khi không còn đỉnh kề chưa thăm, quay lại bước trước để xét nhánh khác. Cần đánh dấu **trước khi đi tiếp** để cạnh quay về hoặc chu trình không làm duyệt vô hạn. Một lượt DFS từ s chỉ đến các đỉnh có đường đi từ s. Muốn duyệt toàn bộ đồ thị, tiếp tục bắt đầu từ đỉnh chưa thăm.

Truyền mảng đánh dấu vào hàm con

dfs_visit nhận seen và order dùng chung trong một lượt; không phụ thuộc biến toàn cục. dfs tạo lượt mới từ s; dfs_all dùng một seen xuyên suốt các lần bắt đầu. ```python def check_vertex(Adj, s): if not 0 <= s < len(Adj): raise ValueError("Đỉnh nằm ngoài đồ thị") def dfs_visit(Adj, u, seen, order): seen[u] = True order.append(u) for v in Adj[u]: if not seen[v]: dfs_visit(Adj, v, seen, order) def dfs(Adj, s): check_vertex(Adj, s) seen = [False]*len(Adj) order = [] dfs_visit(Adj, s, seen, order) return order def dfs_all(Adj): seen = [False]*len(Adj) order = [] for u in range(len(Adj)): if not seen[u]: dfs_visit(Adj, u, seen, order) return order ```

DFS mẫu bắt đầu từ 0

Các hàng Adj của mẫu được xét tăng dần. Thứ tự phát hiện là **0,1,3,5,4,2**. |Đang ở|Việc tiếp theo| |---|---| |0|Chọn 1 trước 2| |1|Bỏ qua 0 đã thăm, đi 3| |3|Đi 5| |5|Đi 4| |4|Bỏ qua 1, đi 2| |2|0 và 4 đã thăm; quay lại| Đỉnh 6 không xuất hiện vì biệt lập. dfs_all thêm 6 sau lượt này. Đổi thứ tự xét đỉnh kề có thể đổi thứ tự DFS nhưng không đổi tập đỉnh đi tới được. Với danh sách kề, duyệt toàn bộ đồ thị có chi phí O(V+E): mỗi đỉnh thăm một lần, mỗi cạnh vô hướng xét hai chiều, hệ số 2 không làm đổi bậc tăng trưởng. Nếu quét n ô của mỗi hàng ma trận để tìm đỉnh kề thì có thể tốn O(V²). Đệ quy của mẫu dùng đồ thị nhỏ.

Bài luyện

Theo Adj mẫu tăng dần, thứ tự DFS đệ quy từ 0 là gì?
Chọn một đáp án

Bài luyện

Vì sao đánh dấu đỉnh trước khi gọi DFS sang các đỉnh kề?
Chọn một đáp án

Bài luyện

dfs_all cần xử lí thêm 6 sau lượt từ 0 vì lý do nào?
Chọn một đáp án

Đang học