📌  相关文章
📜  查询顶点X和Y是否在无向图的同一连通组件中(1)

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

查询顶点X和Y是否在无向图的同一连通组件中

在无向图中,如果两个顶点X和Y能够通过一系列的边相连,则它们属于同一个连通组件。本文将介绍如何查询两个顶点是否在同一连通组件中。

方法一:深度优先搜索(DFS)

深度优先搜索是一种经典的图遍历算法,可以用于查询两个顶点是否在同一个连通组件中。具体思路是从其中一个顶点开始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]
方法二:并查集(Union-Find)

并查集是一种常见的数据结构,可以用于维护一些彼此之间存在“联通关系”的集合。在无向图中,我们可以用并查集维护每个连通组件的信息,两个顶点属于同一个连通组件当且仅当它们在同一个集合中。具体实现时,我们可以将每个顶点作为一个单独的集合,并按照遍历边的顺序将它们合并起来,直到无法再合并为止。

以下是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)
总结

本文分别介绍了两种查询两个顶点是否在同一个连通组件中的方法:深度优先搜索和并查集。具体实现时,可以根据实际情况选择相应的方法。