📅  最后修改于: 2023-12-03 15:10:48.155000             🧑  作者: Mango
在无向图中,如果两个顶点X和Y能够通过一系列的边相连,则它们属于同一个连通组件。本文将介绍如何查询两个顶点是否在同一连通组件中。
深度优先搜索是一种经典的图遍历算法,可以用于查询两个顶点是否在同一个连通组件中。具体思路是从其中一个顶点开始DFS遍历整个无向图,标记所有遍历到的顶点为已访问。然后判断另一个顶点是否被标记过,如果是,则它们在同一个连通组件中,否则它们不在同一个连通组件中。
以下是Python实现代码:
def dfs(graph, visited, start):
visited[start] = True
for neighbor in graph[start]:
if not visited[neighbor]:
dfs(graph, visited, neighbor)
def is_same_component(graph, x, y):
visited = [False] * len(graph)
dfs(graph, visited, x)
return visited[y]
并查集是一种常见的数据结构,可以用于维护一些彼此之间存在“联通关系”的集合。在无向图中,我们可以用并查集维护每个连通组件的信息,两个顶点属于同一个连通组件当且仅当它们在同一个集合中。具体实现时,我们可以将每个顶点作为一个单独的集合,并按照遍历边的顺序将它们合并起来,直到无法再合并为止。
以下是Python实现代码:
class UnionFind:
def __init__(self, size):
self.parent = list(range(size))
def find(self, x):
if self.parent[x] != x:
self.parent[x] = self.find(self.parent[x])
return self.parent[x]
def union(self, x, y):
px, py = self.find(x), self.find(y)
if px != py:
self.parent[px] = py
def is_same_component(graph, x, y):
uf = UnionFind(len(graph))
for i in range(len(graph)):
for neighbor in graph[i]:
uf.union(i, neighbor)
return uf.find(x) == uf.find(y)
本文分别介绍了两种查询两个顶点是否在同一个连通组件中的方法:深度优先搜索和并查集。具体实现时,可以根据实际情况选择相应的方法。