📜  门| GATE 2017 MOCK II |问题17(1)

📅  最后修改于: 2023-12-03 15:12:35.162000             🧑  作者: Mango

问题17

本题是关于图的连通性的问题。给定一个$N$个节点和$M$条边的无向图,每条边的权重为1。设计一个算法,输出该图的所有联通区域的大小,按升序排列。

示例

输入:

6 5
0 1
1 2
2 3
3 4
4 5

输出:

1 1 1 1 1 1
解析

该图可以用邻接矩阵或邻接表存储。

我们可以使用深度优先搜索算法(DFS)来求解图的连通性。从每个未被访问的节点开始,遍历与之相连通的所有节点,并标记这些节点已经被访问过。通过遍历整个图,我们可以得到图的所有连通区域,每个连通区域的大小就是节点数。

代码如下:

def dfs(graph, v, visited, size):
    visited[v] = True
    size[0] += 1
    for i in graph[v]:
        if not visited[i]:
            dfs(graph, i, visited, size)

def connected_components(n, edges):
    graph = [[] for _ in range(n)]
    for u, v in edges:
        graph[u].append(v)
        graph[v].append(u)

    visited = [False] * n
    sizes = []
    for i in range(n):
        if not visited[i]:
            size = [0]
            dfs(graph, i, visited, size)
            sizes.append(size[0])

    return sizes

n, m = map(int, input().split())
edges = [tuple(map(int, input().split())) for _ in range(m)]
sizes = connected_components(n, edges)
print(*sorted(sizes))

其中,dfs函数实现深度优先搜索,connected_components函数实现图的联通性判断。

输入示例解析:

第一行表示有6个节点和5条边。

接下来的5行分别表示这5条边所连接的两个节点。对于每条边$(u, v)$,我们可以在邻接表中存储两个方向的边$(u, v)$和$(v, u)$。

输出示例解析:

输出结果是每个连通区域的大小,按升序排列。在本例中,所有节点都相互连通,因此输出结果是1 1 1 1 1 1。