📅  最后修改于: 2023-12-03 14:58:22.115000             🧑  作者: Mango
此题是2021年计算机科学门考试的一道题目,属于设置1中的第64章。本题考察了程序员对于编程语言、数据结构和算法的理解。
给定一个无向图G,表示n个节点和m条边。我们需要设计一个算法来找到图中的所有联通组件。
输入文件的第一行包含两个整数n和m,分别表示节点数和边数。以下m行,每行两个整数u和v,表示u和v之间有一条边。
在一行中输出所有联通组件。对于每个连通组件,输出其中的节点ID,根据升序排列。要输出组件之间以逗号分隔。
6 4
1 2
2 3
4 5
5 6
1,2,3
4,5,6
我们可以使用深度优先搜索(DFS)或广度优先搜索(BFS)来找出所有连通组件。选择其中一种算法,访问所有节点,并在每个节点处开始DFS/BFS。在DFS/BFS中,找到所有可到达的节点,并进行标记。当一次DFS/BFS完成后,我们可以找到一个连通组件。重复此过程,直到所有节点都被访问。
下面是一个使用DFS的Python实现,它利用递归调用访问所有可到达的节点,并将它们标记为已访问。在每次DFS调用完成后,我们可以找到一个连通组件,并将该组件添加到结果集中。输出所有组件时,我们只需要根据ID排序并以逗号分隔即可。
def dfs(node, visited, graph, component):
visited.add(node)
component.append(node)
for neighbor in graph[node]:
if neighbor not in visited:
dfs(neighbor, visited, graph, component)
def find_connected_components(n, edges):
graph = {i: [] for i in range(1,n+1)}
for u, v in edges:
graph[u].append(v)
graph[v].append(u)
visited = set()
components = []
for node in range(1, n+1):
if node not in visited:
component = []
dfs(node, visited, graph, component)
component.sort()
components.append(component)
return components
if __name__ == "__main__":
n, m = map(int, input().split())
edges = [tuple(map(int, input().split())) for _ in range(m)]
components = find_connected_components(n, edges)
for component in components:
print(",".join(map(str, component)))
这道题考察了图论的基础知识,程序员需要了解无向图的概念、节点的连通性、DFS/BFS等算法。除此之外,还需要良好的编程技巧,比如如何使用Python的集合、列表、字典等数据结构来表示图,并对节点进行排序。