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 类,您可以轻松地创建图、添加边以及遍历图。图是一种灵活而强大的数据结构,广泛应用于社交网络、交通网络和许多其他领域。希望此文能帮助您更好地理解和应用无向图及其邻接表。欢迎大家在实践中不断探索更多图相关的应用和算法!