Python中最短路径算法的实现方法

2023-04-17 00:00:00 路径 算法 最短

Python中最短路径算法常用的有Dijkstra算法和Floyd算法。

Dijkstra算法

Dijkstra算法是一种贪心算法,用于解决带权重的图中单源最短路径问题。具体实现步骤如下:

  1. 初始化所有顶点的距离为无穷大,起点距离为0,并将起点标记为已访问;

  2. 遍历起点的所有邻居节点,将其距离设为起点距离加上节点间的权重,如果该节点还未被访问,则加入待访问节点数组;

  3. 从待访问节点数组中选择距离最短的节点作为下一个访问节点,标记该节点为已访问;

  4. 重复步骤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算法是一种动态规划算法,用于解决带权重的图中多源最短路径问题。具体实现步骤如下:

  1. 初始化每两个顶点之间的距离为无穷大,自己到自己的距离为0;

  2. 对于每个节点对,判断通过中间节点是否可以比直接连通更短,如果是则更新距离;

  3. 重复步骤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中最短路径算法的实现方法。注意,以上代码可能存在语法或者其他细节问题,仅供参考。

相关文章