📅  最后修改于: 2023-12-03 15:10:56.582000             🧑  作者: Mango
在无向图中,我们往往需要检查图中任意两个点是否在同一个连通分量中。这对于很多算法和应用来说都是非常重要的。
以下是一种简单的实现方法,基于深度优先搜索(DFS)。
n = 10 # 图中点的总数
graph = [[] for _ in range(n)] # 图的邻接表表示
# 初始化图,省略若干行代码
def dfs(u, visited):
visited[u] = True
for v in graph[u]:
if not visited[v]:
dfs(v, visited)
def is_connected(x, y):
visited = [False] * n
dfs(x, visited)
return visited[y]
# 使用示例
print(is_connected(0, 1)) # True
print(is_connected(0, 2)) # False
我们首先构建了一个空的图,然后假设图中有 $n$ 个点。邻接表 graph
是一个长度为 $n$ 的列表,其中每个元素都表示与该点相连的点的列表。
dfs
函数实现了深度优先搜索,用于遍历图中所有与起点 u
直接或间接相连的点。在这个过程中,我们用一个布尔数组 visited
记录每个点是否被访问过。
最后,我们使用 is_connected
函数来检查两个给定的点 x
和 y
是否在同一个连通分量中。具体地说,我们从 x
开始进行一次深度优先搜索,并标记经过的所有点;然后检查 y
是否被标记,如果是就说明两个点在同一个连通分量中,否则它们不在同一个连通分量中。
注意,我们在每次调用 is_connected
函数时都需要新建一个 visited
数组,因为每个调用可能会更新 visited
。如果我们不新建这个数组,那么可能会导致函数返回错误的结果。
这个算法的时间复杂度是 $O(n + m)$,其中 $m$ 是边数。这是因为我们需要对每个点和每条边都进行一次访问。
我们可以通过一些优化来提高效率,例如: