📜  门| GATE CS 2021 |设置1 |第64章(1)

📅  最后修改于: 2023-12-03 14:58:22.115000             🧑  作者: Mango

门 | GATE CS 2021 | 设置1 | 第64章

简介

此题是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的集合、列表、字典等数据结构来表示图,并对节点进行排序。