实现 Python 无向图最短路径算法
在学习图论相关算法时,无向图的最短路径算法是一个非常基础且重要的内容。特别是 Dijkstra 算法,常用于解决从一个顶点到其他顶点的最短路径问题。本文旨在指导初学者如何使用 Python 实现一个简单的无向图最短路径算法。
流程概述
我们将通过以下几个主要步骤来实现无向图的最短路径算法:
| 步骤 | 描述 | 
|---|---|
| 步骤 1 | 初始化图结构 | 
| 步骤 2 | 实现 Dijkstra 算法 | 
| 步骤 3 | 测试算法 | 
| 步骤 4 | 输出结果 | 
以上表格概述了我们将要完成的各个步骤,接下来我们将详细分析每个步骤。
步骤 1:初始化图结构
在这一部分,我们需要使用邻接表的形式来表示无向图。这个过程在代码中可以通过字典来实现。
# 创建一个表示无向图的字典
graph = {
    'A': {'B': 1, 'C': 4},
    'B': {'A': 1, 'C': 2, 'D': 5},
    'C': {'A': 4, 'B': 2, 'D': 1},
    'D': {'B': 5, 'C': 1}
}
这里我们定义了一个包含四个节点(A、B、C、D)的无向图,边的权重分别表示节点之间的距离。
步骤 2:实现 Dijkstra 算法
Dijkstra 算法的核心在于选择尚未处理的节点中距离最小的节点,并更新其邻居的距离。以下是算法的实现:
import heapq
def dijkstra(graph, start):
    # 初始化距离字典和优先队列
    distances = {vertex: float('inf') for vertex in graph}
    distances[start] = 0
    priority_queue = [(0, start)]  # (距离, 节点)
    while priority_queue:
        current_distance, current_vertex = heapq.heappop(priority_queue)
        # 若当前距离大于记录的距离,则跳过
        if current_distance > distances[current_vertex]:
            continue
        # 更新邻居节点的距离
        for neighbor, weight in graph[current_vertex].items():
            distance = current_distance + weight
            
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(priority_queue, (distance, neighbor))
    return distances
代码说明
- 导入库:我们使用 heapq来实现优先队列。
- 初始化距离:生成一个字典来存储每个节点的初始距离,设置为无穷大,起点设置为0。
- 优先队列:使用堆数据结构,存储当前处理的节点及其距离。
- 主循环:从队列中提取出最小距离节点,更新所有邻居节点的距离。
步骤 3:测试算法
接下来,我们使用一些示例节点来测试我们的 Dijkstra 算法。
# 测试 Dijkstra 算法
start_node = 'A'
shortest_paths = dijkstra(graph, start_node)
# 打印最短路径
for vertex, distance in shortest_paths.items():
    print(f"从 {start_node} 到 {vertex} 的最短距离是 {distance}")
步骤 4:输出结果
运行上面的代码,将输出如下结果,显示从节点 A 到其他所有节点的最短距离:
从 A 到 A 的最短距离是 0
从 A 到 B 的最短距离是 1
从 A 到 C 的最短距离是 3
从 A 到 D 的最短距离是 4
结尾
通过以上步骤,我们成功实现了一个基于 Dijkstra 算法的无向图最短路径算法。这段代码不仅简单易懂,而且灵活适用于多种场景。如果你想要对其进行扩展,你可以尝试处理带负权重的图,或是实现其他类型的图算法(如 Bellman-Ford 算法)。
接下来的学习中,不妨尝试创造自己的图,并使用已实现的算法进行测试!祝你在编程的旅程中好运!
 
 
                     
            
        













 
                    

 
                 
                    