Kiểm tra tính liên thông của đơn đồ thị có hướng trang 74 Chuyên đề Tin học 12
Vấn đề 3 trang 74 Chuyên đề Tin học 12: Kiểm tra tính liên thông của đơn đồ thị có hướng
Trong đơn đồ thị có hướng, người ta thường quan tâm đến tính liên thông mạnh của đồ thị. Một đồ thị có hướng được gọi là liên thông mạnh nếu từ một đỉnh bất kì của đồ thị có thể đến được tất cả các đỉnh còn lại.
Các bài toán liên quan đến tính liên thông của đơn đồ thị có hướng cũng có nhiều ứng dụng như tính liên thông của đơn đồ thị vô hướng
Lời giải:
Trong đơn đồ thị có hướng, người ta thường quan tâm đến tính liên thông mạnh của đồ thị. Một đồ thị có hướng được gọi là liên thông mạnh nếu từ một đỉnh bất kì của đồ thị có thể đến được tất cả các đỉnh còn lại.
Các bài toán liên quan đến tính liên thông của đơn đồ thị có hướng cũng có nhiều ứng dụng như tính liên thông của đơn đồ thị vô hướng.
Muốn kiểm tra tính liên thông mạnh của một đồ thị có hướng, chúng ta cần đảm bảo rằng từ bất kỳ đỉnh nào cũng có thể đi đến tất cả các đỉnh khác. Điều này yêu cầu mỗi đỉnh có thể đạt tới tất cả các đỉnh khác thông qua các cung của đồ thị có một thuật toán hiệu quả để kiểm tra tính liên thông mạnh của đồ thị có hướng, đó là thuật toán Kosaraju. Các bước của thuật toán như sau:
* Thuật toán Kosaraju
- Chạy DFS từ tất cả các đỉnh và lưu thứ tự hoàn thành của các đỉnh: Duyệt đồ thị và sử dụng DFS để lưu trữ thứ tự hoàn thành của các đỉnh trong một stack.
- Đảo ngược đồ thị: Tạo một đồ thị mới với tất cả các cạnh đảo ngược so với đồ thị gốc.
- Chạy DFS trên đồ thị đảo ngược theo thứ tự hoàn thành: Sử dụng stack từ bước 1 để chạy DFS trên đồ thị đảo ngược, bắt đầu từ đỉnh cuối cùng trong stack. Mỗi lần chạy DFS, các đỉnh được duyệt sẽ tạo thành một thành phần liên thông mạnh. Nếu sau bước 3, chỉ có một thành phần liên thông mạnh duy nhất chứa tất cả các đỉnh, thì đồ thị gốc là liên thông mạnh.
* Chương trình Python:
def kosaraju(n, edges):
# Bước 1: Xây dựng đồ thị và chạy DFS để có thứ tự hoàn thành
def dfs(v, graph, visited, stack):
visited[v] = True
for neighbor in graph[v]:
if not visited[neighbor]:
dfs(neighbor, graph, visited, stack)
stack.append(v)
# Bước 2: Đảo ngược đồ thị
def reverse_graph(n, edges):
reversed_graph = [[] for _ in range(n)]
for u, v in edges:
reversed_graph[v].append(u)
return reversed_graph
# Bước 3: Chạy DFS trên đồ thị đảo ngược theo thứ tự hoàn thành
def fill_order(n, graph):
visited = [False] * n
stack = []
for i in range(n):
if not visited[i]:
dfs(i, graph, visited, stack)
return stack
def get_sccs(n, reversed_graph, stack):
visited = [False] * n
sccs = []
while stack:
v = stack.pop()
if not visited[v]:
scc_stack = []
dfs(v, reversed_graph, visited, scc_stack)
sccs.append(scc_stack)
return sccs
# Xây dựng đồ thị
graph = [[] for _ in range(n)]
for u, v in edges:
graph[u].append(v)
# Bước 1: Chạy DFS và lấy thứ tự hoàn thành
stack = fill_order(n, graph)
# Bước 2: Đảo ngược đồ thị
reversed_graph = reverse_graph(n, edges)
# Bước 3: Chạy DFS trên đồ thị đảo ngược theo thứ tự hoàn thành
sccs = get_sccs(n, reversed_graph, stack)
# Kiểm tra số lượng thành phần liên thông mạnh
return len(sccs) == 1
# Ví dụ sử dụng
n = 5
edges = [(0, 1), (1, 2), (2, 0), (1, 3), (3, 4), (4, 1)]
print(kosaraju(n, edges)) # Kết quả: True, đồ thị liên thông mạnh
Lời giải bài tập Chuyên đề Tin 12 Bài 6: Dự án học tập: Tìm hiểu các vấn đề ứng dụng đồ thị hay, chi tiết khác:
Vấn đề 1 trang 73 Chuyên đề Tin học 12: Tìm đường đi ngắn nhất trên đơn đồ thị có hướng ....
Vấn đề 2 trang 73 Chuyên đề Tin học 12: Kiểm tra tính liên thông của đơn đồ thị vô hướng ....
Xem thêm lời giải bài tập Chuyên đề học tập Tin học 12 Cánh diều hay, chi tiết khác:
Xem thêm các tài liệu học tốt lớp 12 hay khác:
- Giải Chuyên đề Tin học 12 Kết nối tri thức
- Giải Chuyên đề Tin học 12 Chân trời sáng tạo
- Giải Chuyên đề Tin học 12 Cánh diều
- Giải lớp 12 Kết nối tri thức (các môn học)
- Giải lớp 12 Chân trời sáng tạo (các môn học)
- Giải lớp 12 Cánh diều (các môn học)
- Giải Tiếng Anh 12 Global Success
- Giải sgk Tiếng Anh 12 Smart World
- Giải sgk Tiếng Anh 12 Friends Global
- Lớp 12 Kết nối tri thức
- Soạn văn 12 (hay nhất) - KNTT
- Soạn văn 12 (ngắn nhất) - KNTT
- Giải sgk Toán 12 - KNTT
- Giải sgk Vật Lí 12 - KNTT
- Giải sgk Hóa học 12 - KNTT
- Giải sgk Sinh học 12 - KNTT
- Giải sgk Lịch Sử 12 - KNTT
- Giải sgk Địa Lí 12 - KNTT
- Giải sgk Giáo dục KTPL 12 - KNTT
- Giải sgk Tin học 12 - KNTT
- Giải sgk Công nghệ 12 - KNTT
- Giải sgk Hoạt động trải nghiệm 12 - KNTT
- Giải sgk Giáo dục quốc phòng 12 - KNTT
- Giải sgk Âm nhạc 12 - KNTT
- Giải sgk Mĩ thuật 12 - KNTT
- Lớp 12 Chân trời sáng tạo
- Soạn văn 12 (hay nhất) - CTST
- Soạn văn 12 (ngắn nhất) - CTST
- Giải sgk Toán 12 - CTST
- Giải sgk Vật Lí 12 - CTST
- Giải sgk Hóa học 12 - CTST
- Giải sgk Sinh học 12 - CTST
- Giải sgk Lịch Sử 12 - CTST
- Giải sgk Địa Lí 12 - CTST
- Giải sgk Giáo dục KTPL 12 - CTST
- Giải sgk Tin học 12 - CTST
- Giải sgk Hoạt động trải nghiệm 12 - CTST
- Giải sgk Âm nhạc 12 - CTST
- Lớp 12 Cánh diều
- Soạn văn 12 Cánh diều (hay nhất)
- Soạn văn 12 Cánh diều (ngắn nhất)
- Giải sgk Toán 12 Cánh diều
- Giải sgk Vật Lí 12 - Cánh diều
- Giải sgk Hóa học 12 - Cánh diều
- Giải sgk Sinh học 12 - Cánh diều
- Giải sgk Lịch Sử 12 - Cánh diều
- Giải sgk Địa Lí 12 - Cánh diều
- Giải sgk Giáo dục KTPL 12 - Cánh diều
- Giải sgk Tin học 12 - Cánh diều
- Giải sgk Công nghệ 12 - Cánh diều
- Giải sgk Hoạt động trải nghiệm 12 - Cánh diều
- Giải sgk Giáo dục quốc phòng 12 - Cánh diều
- Giải sgk Âm nhạc 12 - Cánh diều