Giải chuyên đề Tin 12 KNTT Bài 15: Thực hành duyệt đồ thị theo chiều sâu có đáp án

28 người thi tuần này 4.6 155 lượt thi 5 câu hỏi

🔥 Đề thi HOT:

864 người thi tuần này

15 câu Trắc nghiệm Tin học 12 Kết nối tri thức Bài 19 có đáp án

5.6 K lượt thi 15 câu hỏi
575 người thi tuần này

15 câu Trắc nghiệm Tin học 12 Kết nối tri thức Bài 23 có đáp án

2.6 K lượt thi 15 câu hỏi
413 người thi tuần này

15 câu Trắc nghiệm Tin học 12 Kết nối tri thức Bài 24 có đáp án

1.9 K lượt thi 15 câu hỏi
401 người thi tuần này

15 câu Trắc nghiệm Tin học 12 Kết nối tri thức Bài 22 có đáp án

2.5 K lượt thi 15 câu hỏi
400 người thi tuần này

Trắc nghiệm tổng hợp Tin học năm 2023 có đáp án (Phần 4)

4.4 K lượt thi 217 câu hỏi
369 người thi tuần này

15 câu Trắc nghiệm Tin học 12 Kết nối tri thức Bài 25 có đáp án

1.4 K lượt thi 15 câu hỏi
318 người thi tuần này

15 câu Trắc nghiệm Tin học 12 Kết nối tri thức Bài 20 có đáp án

2.5 K lượt thi 15 câu hỏi
315 người thi tuần này

15 câu Trắc nghiệm Tin học 12 Kết nối tri thức Bài 16 có đáp án

2.9 K lượt thi 15 câu hỏi

Nội dung liên quan:

Danh sách câu hỏi:

Lời giải

Để kiểm tra xem một đồ thị có chu trình hay không, chúng ta có thể sử dụng thuật toán DFS (Duyệt Đầu Tiên) hoặc BFS (Duyệt Theo Chiều Rộng). Dưới đây là cách kiểm tra bằng DFS:

- Bắt đầu từ một đỉnh bất kỳ trong đồ thị.

- Thực hiện duyệt DFS từ đỉnh này.

- Trong quá trình duyệt, nếu đỉnh nào đã được thăm trước đó và không phải là đỉnh cha của đỉnh hiện tại (trong trường hợp của cây), tức là tìm thấy một chu trình.

- Nếu tất cả các đỉnh đều đã được duyệt và không tìm thấy chu trình, đồ thị không chứa chu trình.

Lời giải

Để kiểm tra chu trình trong một đồ thị vô hướng, cách tiếp cận có thể khác so với đồ thị có hướng. Trong trường hợp đồ thị vô hướng, mỗi cạnh được coi là một liên kết giữa hai đỉnh, không có khái niệm đỉnh cha và đỉnh con.

Một cách để kiểm tra chu trình trong đồ thị vô hướng là sử dụng duyệt DFS nhưng cần phải theo dõi đỉnh trước đó mà không phải là đỉnh hiện tại (cha của đỉnh hiện tại) để tránh lặp lại qua cùng một cạnh. Nếu trong quá trình duyệt, gặp một đỉnh đã được thăm trước đó và không phải là đỉnh cha của đỉnh hiện tại, thì có thể kết luận rằng đồ thị chứa chu trình.

Lời giải

Phiên bản mẫu của hàm DFS_acyclic sử dụng phương pháp không đệ quy của thuật toán DFS để kiểm tra xem một đồ thị có chứa chu trình hay không:

def DFS_acyclic(Adj, s):

    stack = [(s, None)]  # Dùng stack để thực hiện DFS, cặp (đỉnh, đỉnh cha)

    visited = set()  # Dùng set để theo dõi các đỉnh đã thăm

    while stack:

        node, parent = stack.pop()  # Lấy đỉnh ra khỏi stack

        if node in visited:  # Nếu đỉnh đã được thăm trước đó

            return True  # Tìm thấy chu trình

        visited.add(node)  # Đánh dấu đỉnh đã thăm

        for neighbor in Adj[node]:  # Duyệt các đỉnh kề của đỉnh hiện tại

            if neighbor != parent:  # Tránh quay lại đỉnh cha

                stack.append((neighbor, node))  # Thêm đỉnh kề vào stack

    return False  # Không tìm thấy chu trình

# Sử dụng hàm kiểm tra chu trình không đệ quy

graph_undirected = {

    0: [1, 2],

    1: [0, 3],

    2: [0, 3],

    3: [1, 2]

}

if DFS_acyclic(graph_undirected, 0):

    print("Đồ thị vô hướng có chu trình")

else:

    print("Đồ thị vô hướng không có chu trình")

Trong hàm này:

- Chúng ta sử dụng một stack để thực hiện duyệt DFS thay vì đệ quy.

- Mỗi lần duyệt, chúng ta kiểm tra xem đỉnh hiện tại đã được thăm trước đó chưa. Nếu có, chúng ta tìm thấy chu trình.

- Nếu không, chúng ta đánh dấu đỉnh đó đã được thăm và duyệt qua tất cả các đỉnh kề của nó, tránh quay lại đỉnh.

Lời giải

Bạn cần đăng ký gói VIP ( giá chỉ từ 199K ) để làm bài, xem đáp án và lời giải chi tiết không giới hạn.

Nâng cấp VIP

4.6

31 Đánh giá

50%

40%

0%

0%

0%