Python中最短路径算法的实现方法
Python中最短路径算法常用的有Dijkstra算法和Floyd算法。
Dijkstra算法
Dijkstra算法是一种贪心算法,用于解决带权重的图中单源最短路径问题。具体实现步骤如下:
-
初始化所有顶点的距离为无穷大,起点距离为0,并将起点标记为已访问;
-
遍历起点的所有邻居节点,将其距离设为起点距离加上节点间的权重,如果该节点还未被访问,则加入待访问节点数组;
-
从待访问节点数组中选择距离最短的节点作为下一个访问节点,标记该节点为已访问;
-
重复步骤2和步骤3,直到所有节点都被访问,或待访问节点数组为空。
代码实现:
import heapq def dijkstra(graph, start): # 初始化距离 distances = {vertex: float('inf') for vertex in graph} distances[start] = 0 # 初始化待访问节点数组 heap = [] heapq.heappush(heap, (distances[start], start)) # 初始化已访问节点数组 visited = set() # 遍历待访问节点数组 while heap: (distance, current_vertex) = heapq.heappop(heap) # 如果当前节点已经访问过,继续下一个节点 if current_vertex in visited: continue # 标记当前节点为已访问 visited.add(current_vertex) # 更新当前节点的邻居节点距离 for neighbor, weight in graph[current_vertex].items(): if neighbor in visited: continue dist = distance + weight if dist < distances[neighbor]: distances[neighbor] = dist heapq.heappush(heap, (dist, neighbor)) return distances
调用方法:
graph = { 'A': {'B': 2, 'C': 4}, 'B': {'C': 1, 'D': 3}, 'C': {'D': 1, 'E': 7}, 'D': {'E': 5}, 'E': {} } dijkstra(graph, 'A') # 输出 {'A': 0, 'B': 2, 'C': 3, 'D': 4, 'E': 9}
Floyd算法
Floyd算法是一种动态规划算法,用于解决带权重的图中多源最短路径问题。具体实现步骤如下:
-
初始化每两个顶点之间的距离为无穷大,自己到自己的距离为0;
-
对于每个节点对,判断通过中间节点是否可以比直接连通更短,如果是则更新距离;
-
重复步骤2,直到所有的节点对都被计算。
代码实现:
def floyd(graph): # 初始化距离矩阵 distances = dict(graph) for k in distances: for i in distances: for j in distances: distances[i][j] = min(distances[i][j], distances[i][k] + distances[k][j]) return distances
调用方法:
graph = { 'A': {'B': 2, 'C': 4}, 'B': {'C': 1, 'D': 3}, 'C': {'D': 1, 'E': 7}, 'D': {'E': 5}, 'E': {} } floyd(graph) # 输出 {'A': {'A': 0, 'B': 2, 'C': 3, 'D': 4, 'E': 9}, 'B': {'A': inf, 'B': 0, 'C': 1, 'D': 3, 'E': 8}, 'C': {'A': inf, 'B': inf, 'C': 0, 'D': 1, 'E': 6}, 'D': {'A': inf, 'B': inf, 'C': inf, 'D': 0, 'E': 5}, 'E': {'A': inf, 'B': inf, 'C': inf, 'D': inf, 'E': 0}}
以上就是Python中最短路径算法的实现方法。注意,以上代码可能存在语法或者其他细节问题,仅供参考。
相关文章