简介:Dijkstra 算法是一种用于解决最短路径问题的图论算法。它通过逐步构建最短路径树,从源节点开始,不断更新所有相邻节点的最短路径长度,最终找到从源节点到目标节点的最短路径。本篇文章将介绍如何使用 Python 实现 Dijkstra 算法,并通过示例来展示其应用。
Dijkstra 算法是一种用于解决最短路径问题的图论算法。它通过逐步构建最短路径树,从源节点开始,不断更新所有相邻节点的最短路径长度,最终找到从源节点到目标节点的最短路径。下面我们将使用 Python 来实现 Dijkstra 算法。
首先,我们需要定义一个类来表示图的数据结构。该类应该包含添加节点和边的方法,以及一个方法来获取给定源节点到目标节点的最短路径。
class Graph:def __init__(self):self.graph = {}def add_node(self, node):if node not in self.graph:self.graph[node] = []def add_edge(self, source, destination, weight):if source in self.graph:self.graph[source].append((destination, weight))else:self.graph[source] = [(destination, weight)]
接下来,我们实现 Dijkstra 算法的函数。该函数接受图对象、源节点和目标节点作为参数,并返回从源节点到目标节点的最短路径。
def dijkstra(graph, source, target):# 初始化距离字典,将所有节点距离设置为无穷大,将源节点距离设置为0distance = {node: float('inf') for node in graph.graph}distance[source] = 0# 初始化已访问节点集合visited = set()# 创建优先级队列并将源节点加入队列中queue = [(0, source)]while queue:# 取出队列中距离最小的节点current_distance, current_node = heapq.heappop(queue)# 如果该节点已访问过,跳过此次循环if current_node in visited:continue# 将当前节点标记为已访问visited.add(current_node)# 遍历当前节点的邻居节点for neighbor, weight in graph.graph[current_node]:# 计算经过当前节点后的邻居节点距离distance_through_u = current_distance + weight# 如果经过当前节点后的邻居节点距离小于之前计算的距离,更新距离字典和最短路径字典if distance_through_u < distance[neighbor]:distance[neighbor] = distance_through_uheapq.heappush(queue, (distance[neighbor], neighbor))# 在最短路径字典中记录经过的节点和距离shortest_path = {node: (current_node, distance[node]) for node in visited}shortest_path[neighbor] = (current_node, distance[neighbor])return shortest_path, distance[target] # 返回最短路径和目标节点的距离