数据结构与算法之数据结构 图连通性 并查集 / 邻接表 判断

数据结构与算法阿木 发布于 6 天前 1 次阅读


摘要:

图是数据结构中的一种重要类型,它由节点和边组成,用于表示实体之间的关系。图连通性是图论中的一个基本概念,指的是图中任意两个节点之间都存在路径相连。本文将探讨两种常用的图连通性判断方法:并查集和邻接表,并分别通过代码实现这两种方法。

一、

图连通性判断是图论中的一个重要问题,它对于网络通信、路径规划等领域具有重要意义。在图论中,常用的图连通性判断方法有深度优先搜索(DFS)、广度优先搜索(BFS)和并查集等。本文将重点介绍并查集和邻接表两种方法,并通过代码实现来展示它们在图连通性判断中的应用。

二、并查集

并查集(Union-Find)是一种用于处理一些不交集的合并及查询问题的数据结构,它支持两种操作:查找(Find)和合并(Union)。并查集在图连通性判断中的应用主要是通过合并操作来模拟图中节点的连接。

1. 并查集的基本操作

(1)初始化:创建一个大小为n的数组parent,用于存储每个节点的父节点,初始时每个节点的父节点都是自己。

(2)查找操作:查找操作用于找到某个节点的根节点。如果节点是根节点,则返回该节点;否则,递归查找其父节点的根节点。

(3)合并操作:合并操作用于将两个不相交的集合合并成一个集合。首先找到两个集合的根节点,然后让其中一个集合的根节点指向另一个集合的根节点。

2. 并查集在图连通性判断中的应用

(1)初始化:创建一个大小为n的数组parent,用于存储每个节点的父节点。

(2)遍历图中的边:对于每条边(u, v),使用并查集的查找操作找到u和v的根节点,如果它们的根节点相同,则说明它们已经连接,否则使用并查集的合并操作将它们连接。

(3)判断连通性:遍历所有节点,使用并查集的查找操作找到每个节点的根节点,如果所有节点的根节点相同,则说明图是连通的;否则,图是不连通的。

以下是并查集在图连通性判断中的代码实现:

python

class UnionFind:


def __init__(self, n):


self.parent = [i for i in range(n)]

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):


rootX = self.find(x)


rootY = self.find(y)


if rootX != rootY:


self.parent[rootX] = rootY

def is_connected(graph):


n = len(graph)


uf = UnionFind(n)


for u, v in graph:


uf.union(u, v)


root = uf.find(0)


for i in range(1, n):


if uf.find(i) != root:


return False


return True

示例


graph = [(0, 1), (1, 2), (2, 3), (3, 4)]


print(is_connected(graph)) 输出:True


三、邻接表

邻接表是一种表示图的存储方式,它使用一个数组来存储图中的所有节点,每个节点对应一个链表,链表中存储与该节点相连的所有节点。

1. 邻接表的基本操作

(1)初始化:创建一个大小为n的数组adjList,用于存储每个节点的邻接表。

(2)添加边:对于每条边(u, v),在u的邻接表中添加v,在v的邻接表中添加u。

(3)遍历邻接表:对于每个节点,遍历其邻接表,访问所有相邻的节点。

2. 邻接表在图连通性判断中的应用

(1)初始化:创建一个大小为n的数组adjList,用于存储每个节点的邻接表。

(2)遍历图中的边:对于每条边(u, v),在u的邻接表中添加v,在v的邻接表中添加u。

(3)判断连通性:从任意一个节点开始,使用深度优先搜索(DFS)或广度优先搜索(BFS)遍历图,如果能够访问到所有节点,则说明图是连通的;否则,图是不连通的。

以下是邻接表在图连通性判断中的代码实现:

python

class Graph:


def __init__(self, n):


self.adjList = [[] for _ in range(n)]

def add_edge(self, u, v):


self.adjList[u].append(v)


self.adjList[v].append(u)

def is_connected(graph):


visited = [False] len(graph)


def dfs(node):


visited[node] = True


for neighbor in graph.adjList[node]:


if not visited[neighbor]:


dfs(neighbor)

dfs(0)


return all(visited)

示例


graph = Graph(5)


graph.add_edge(0, 1)


graph.add_edge(1, 2)


graph.add_edge(2, 3)


graph.add_edge(3, 4)


print(is_connected(graph)) 输出:True


四、总结

本文介绍了两种常用的图连通性判断方法:并查集和邻接表。并查集通过合并操作模拟节点的连接,而邻接表则通过遍历邻接表来判断连通性。通过代码实现,我们可以看到这两种方法在图连通性判断中的应用。在实际应用中,根据具体问题选择合适的方法可以提高算法的效率。