📅  最后修改于: 2023-12-03 15:12:35.162000             🧑  作者: Mango
本题是关于图的连通性的问题。给定一个$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。