Chuyên đề Tin học 12 Bài 15 (Kết nối tri thức): Thực hành duyệt đồ thị theo chiều sâu
Với giải bài tập Chuyên đề Tin học 12 Bài 15: Thực hành duyệt đồ thị theo chiều sâu sách Kết nối tri thức hay nhất, chi tiết giúp học sinh dễ dàng làm bài tập Chuyên đề học tập Tin học 12 Bài 15.
Giải Chuyên đề Tin học 12 Bài 15: Thực hành duyệt đồ thị theo chiều sâu
Khởi động trang 72 Chuyên đề Tin học 12: Trong lí thuyết đồ thị, chu trình được định nghĩa là một đường đi không tầm thường khép kín, tức là đường đi có số cạnh lớn hơn 1 và đỉnh xuất phát trùng với đỉnh kết thúc. Làm cách nào để kiểm tra một đồ thị cho trước có chu trình hay không?
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.
Luyện tập 1 trang 74 Chuyên đề Tin học 12: Hàm kiểm tra chu trình của đồ thị trên còn đúng không nếu đồ thị ban đầu là vô hướng?
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.
Luyện tập 2 trang 74 Chuyên đề Tin học 12: Viết lại hàm kiểm tra chu trình DFS_acyclic(Adj,s) trong chương trình trên nhưng sử dụng phương án không đệ quy của thuật toán DFS.
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.
Vận dụng 1 trang 74 Chuyên đề Tin học 12: Sửa lại chương trình bổ sung thông báo nếu hệ thống chuyên đề không hợp lí thì thông báo dãy các chuyên đề có mâu thuẫn về kiến thức.
Lời giải:
Phiên bản mẫu gợi ý sửa đổi của chương trình để bổ sung thông báo nếu hệ thống chuyên đề không hợp lý và hiển thị dãy các chuyên đề có mâu thuẫn về kiến thức:
def DFS(graph, start, visited, stack):
visited[start] = True
for neighbor in graph[start]:
if not visited[neighbor]:
DFS(graph, neighbor, visited, stack)
stack.append(start)
def topological_sort(graph):
num_nodes = len(graph)
visited = [False] * num_nodes
stack = []
for node in range(num_nodes):
if not visited[node]:
DFS(graph, node, visited, stack)
return stack[::-1]
def is_valid_system(topological_order, prerequisites):
knowledge = set()
for course in topological_order:
knowledge.add(course)
if course in prerequisites:
for prerequisite in prerequisites[course]:
if prerequisite not in knowledge:
return False, [course, prerequisite]
return True, None
def check_course_system(prerequisites):
graph = {}
for course, prereq in prerequisites.items():
if course not in graph:
graph[course] = []
graph[course].extend(prereq)
topological_order = topological_sort(graph)
valid, conflicting_topics = is_valid_system(topological_order, prerequisites)
if valid:
print("Hệ thống chuyên đề hợp lý.")
else:
print("Hệ thống chuyên đề không hợp lý.")
print("Dãy các chuyên đề có mâu thuẫn về kiến thức:", conflicting_topics)
# Dữ liệu chuyên đề và tiên điều kiện
prerequisites = {
"A": ["B"],
"B": ["C"],
"C": ["D"],
"D": ["A"] # Mâu thuẫn về kiến thức với tiên điều kiện của D
}
# Kiểm tra hệ thống chuyên đề
check_course_system(prerequisites)
Vận dụng 2 trang 74 Chuyên đề Tin học 12: Mở rộng bài tập trên cho đồ thị có hướng bất kì G = (V, E), được biểu diễn bởi ma trận kề A hoặc danh sách kề Adj. Viết hàm kiểm tra xem đồ thị G có chu trình hay không, nếu có thì hiển thị trên màn hình chu trình đó, bao gồm dãy các đỉnh tham gia vào chu trình.
Lời giải:
Hướng dẫn phiên bản mẫu của hàm để kiểm tra xem một đồ thị có chu trình hay không, và nếu có, hiển thị chu trình đó:
def has_cycle_directed(graph):
def dfs(node, visited, stack):
visited[node] = True
stack.append(node)
for neighbor in graph[node]:
if neighbor in stack: # Nếu neighbor đã có trong stack, tức là tìm thấy chu trình
cycle_start = stack.index(neighbor)
return stack[cycle_start:]
if not visited[neighbor]: # Nếu neighbor chưa được thăm, tiếp tục duyệt DFS từ neighbor
result = dfs(neighbor, visited, stack)
if result: # Nếu tìm thấy chu trình từ neighbor, trả về chu trình
return result
stack.pop() # Loại bỏ node khỏi stack khi đã duyệt xong tất cả các neighbor của nó
return None
num_nodes = len(graph)
visited = [False] * num_nodes
for node in range(num_nodes):
cycle = dfs(node, visited, [])
if cycle: # Nếu tìm thấy chu trình từ đỉnh node, trả về chu trình
return cycle
return None
def get_cycle_nodes(cycle, graph):
cycle_nodes = []
for node in cycle:
cycle_nodes.append(node)
if node == cycle[-1]: # Nếu đỉnh hiện tại là đỉnh cuối cùng của chu trình
break
return cycle_nodes
def check_and_print_cycle(graph):
cycle = has_cycle_directed(graph)
if cycle:
cycle_nodes = get_cycle_nodes(cycle, graph)
print("Đồ thị có chu trình:", cycle_nodes)
else:
print("Đồ thị không có chu trình")
# Hàm kiểm tra và hiển thị chu trình trong đồ thị
graph_directed = {
0: [1],
1: [2],
2: [3],
3: [4],
4: [2] # Chu trình: 2 -> 3 -> 4 -> 2
}
check_and_print_cycle(graph_directed)
Trong mã này:
- Hàm has_cycle_directed sử dụng duyệt DFS để kiểm tra xem đồ thị có chu trình hay không. Nếu tìm thấy chu trình, nó trả về chu trình dưới dạng một danh sách các đỉnh.
- Hàm get_cycle_nodes giúp lấy ra danh sách các đỉnh tham gia vào chu trình từ chu trình được trả về bởi hàm has_cycle_directed.
- Hàm check_and_print_cycle kiểm tra và hiển thị chu trình trong đồ thị, nếu có
Xem thêm các chương trình khác:
- Soạn văn 12 Kết nối tri thức (hay nhất)
- Văn mẫu 12 - Kết nối tri thức
- Tóm tắt tác phẩm Ngữ văn 12 – Kết nối tri thức
- Tác giả tác phẩm Ngữ văn 12 - Kết nối tri thức
- Bố cục tác phẩm Ngữ văn 12 – Kết nối tri thức
- Nội dung chính tác phẩm Ngữ văn 12 – Kết nối tri thức
- Giải sgk Toán 12 – Kết nối tri thức
- Giải Chuyên đề học tập Toán 12 – Kết nối tri thức
- Lý thuyết Toán 12 – Kết nối tri thức
- Giải sbt Toán 12 – Kết nối tri thức
- Bài tập Tiếng Anh 12 Global success theo Unit có đáp án
- Giải sgk Tiếng Anh 12 - Global success
- Trọn bộ Từ vựng Tiếng Anh 12 Global success đầy đủ nhất
- Trọn bộ Ngữ pháp Tiếng Anh 12 Global success đầy đủ nhất
- Giải sbt Tiếng Anh 12 – Global Success
- Giải sgk Vật lí 12 – Kết nối tri thức
- Giải Chuyên đề học tập Vật lí 12 – Kết nối tri thức
- Lý thuyết Vật lí 12 – Kết nối tri thức
- Giải sbt Vật lí 12 – Kết nối tri thức
- Giải sgk Hóa học 12 – Kết nối tri thức
- Giải Chuyên đề học tập Hóa 12 – Kết nối tri thức
- Lý thuyết Hóa 12 – Kết nối tri thức
- Giải sbt Hóa 12 – Kết nối tri thức
- Chuyên đề dạy thêm Hóa 12 cả 3 sách (chương trình mới 2025)
- Giải sgk Sinh học 12 – Kết nối tri thức
- Giải Chuyên đề học tập Sinh học 12 – Kết nối tri thức
- Lý thuyết Sinh học 12 – Kết nối tri thức
- Giải sbt Sinh học 12 – Kết nối tri thức
- Giải sgk Lịch sử 12 – Kết nối tri thức
- Giải Chuyên đề học tập Lịch sử 12 – Kết nối tri thức
- Giải sbt Lịch sử 12 – Kết nối tri thức
- Giải sgk Địa lí 12 – Kết nối tri thức
- Giải Chuyên đề học tập Địa lí 12 – Kết nối tri thức
- Giải sbt Địa lí 12 – Kết nối tri thức
- Giải sgk Công nghệ 12 – Kết nối tri thức
- Giải sgk Kinh tế pháp luật 12 – Kết nối tri thức
- Giải Chuyên đề học tập Kinh tế pháp luật 12 – Kết nối tri thức
- Giải sbt Kinh tế pháp luật 12 – Kết nối tri thức
- Giải sgk Giáo dục quốc phòng 12 – Kết nối tri thức
- Giải sgk Hoạt động trải nghiệm 12 – Kết nối tri thức