Python 中的无向图及其邻接表实现
在计算机科学中,图是一种重要的数据结构,用于表示对象之间的关系。图由顶点(或节点)和边构成。在这篇文章中,我们将探讨如何在 Python 中实现一个无向图,特别关注通过邻接表表示图的结构。
什么是无向图?
无向图是一种图,其中边没有方向。也就是说,如果存在从顶点 A 到顶点 B 的边,则可以从 A 到 B 走,也可以从 B 到 A 走。在无向图中,每条边都是一对顶点。
邻接表
邻接表是一种常用的图表示方法。它通过一个数组(或字典)来存储每个顶点以及与之相连接的顶点列表。对于每个顶点,我们仅存储与它直接相连的顶点。因此,邻接表在存储稀疏图时非常高效。
邻接表的实现
下面是一个使用 Python 实现的无向图的邻接表示例。这个示例中,我们定义了一个 Graph 类,包含添加边和打印图的功能。
class Graph:
def __init__(self):
# 初始化图的邻接表
self.adjacency_list = {}
def add_edge(self, vertex1, vertex2):
# 添加边
if vertex1 not in self.adjacency_list:
self.adjacency_list[vertex1] = []
if vertex2 not in self.adjacency_list:
self.adjacency_list[vertex2] = []
# 由于是无向图,双向添加
self.adjacency_list[vertex1].append(vertex2)
self.adjacency_list[vertex2].append(vertex1)
def print_graph(self):
# 打印图的邻接表
for vertex in self.adjacency_list:
print(f"{vertex}: {' -> '.join(map(str, self.adjacency_list[vertex]))}")
使用示例
下面是如何使用 Graph 类的实例:
# 创建图的实例
g = Graph()
# 添加边
g.add_edge('A', 'B')
g.add_edge('A', 'C')
g.add_edge('B', 'D')
g.add_edge('C', 'D')
# 打印图
g.print_graph()
运行上述代码,将输出如下内容:
A: B -> C
B: A -> D
C: A -> D
D: B -> C
图的遍历
在实际应用中,图的遍历是一个常见的操作。我们可以使用深度优先搜索(DFS)或广度优先搜索(BFS)算法来遍历图。
以下是 DFS 的实现:
def dfs(graph, vertex, visited=None):
if visited is None:
visited = set()
# 标记当前节点为已访问
visited.add(vertex)
print(vertex, end=" ")
# 递归访问未访问的邻居
for neighbor in graph.adjacency_list[vertex]:
if neighbor not in visited:
dfs(graph, neighbor, visited)
使用 DFS
可以通过以下方式使用 DFS 来遍历图:
# 创建图并添加边
g = Graph()
g.add_edge('A', 'B')
g.add_edge('A', 'C')
g.add_edge('B', 'D')
g.add_edge('C', 'D')
# 深度优先遍历
print("DFS Traversal:")
dfs(g, 'A')
运行上述代码,将输出:
DFS Traversal:
A B D C
图的可视化流程图
以下是图的构建和遍历流程的可视化表示,使用 Mermaid 语法:
flowchart TD
A[创建图的实例] --> B[添加边: A-B]
B --> C[添加边: A-C]
C --> D[添加边: B-D]
D --> E[添加边: C-D]
E --> F[打印图]
F --> G[进行深度优先遍历]
结论
在这篇文章中,我们探讨了无向图的基本概念和邻接表的实现。通过 Python 的 Graph 类,您可以轻松地创建图、添加边以及遍历图。图是一种灵活而强大的数据结构,广泛应用于社交网络、交通网络和许多其他领域。希望此文能帮助您更好地理解和应用无向图及其邻接表。欢迎大家在实践中不断探索更多图相关的应用和算法!
















