📌  相关文章
📜  从所有顶点到目的地的最短路径(1)

📅  最后修改于: 2023-12-03 15:06:35.562000             🧑  作者: Mango

从所有顶点到目的地的最短路径

什么是最短路径问题

在图论中,最短路径问题是指从图中的一个顶点出发到达另一个顶点所需要经过的最少边数或权值最小的路径。在具体应用中,最短路径问题有许多变形,比如求所有顶点到某一顶点的最短路径,或是求某一顶点到所有顶点的最短路径。

解决最短路径问题的算法

在图论中,最短路径问题的解决算法有很多种,下面主要介绍三种常见的算法:

Dijkstra算法

Dijkstra算法是一种贪心算法,用于解决从一个源点到其余各个顶点的最短路径问题。该算法的基本思想是从起点开始,每次添加已经被确认的距离起点最短的点,并更新其他点的距离。

Bellman-Ford算法

Bellman-Ford算法是一种动态规划算法,用于解决包含负权边的图中的单源最短路径问题。该算法的基本思想是通过顶点的松弛操作来逐步缩小源点到所有顶点的最短路径。

Floyd算法

Floyd算法是一种动态规划算法,用于解决图中任意两点之间的最短路径问题。该算法的基本思想是通过中间点的枚举来逐步缩小两点之间的距离。

示例代码

下面是一个使用Dijkstra算法求所有顶点到目的地的最短路径的示例代码:

import heapq
import sys

def shortestPath(graph, start):
    """
    :param graph: 图
    :param start: 起点
    """
    distance = {node: sys.maxsize for node in graph}  # 用字典存储起点到每个顶点的距离(初始值无限大)
    distance[start] = 0  # 起点到自己的距离为0
    queue = [(0, start)]  # 用堆存储未被遍历的节点(距离,节点)

    while queue:
        current_distance, current_node = heapq.heappop(queue)  # 取出离起点最近的未遍历节点
        if current_distance > distance[current_node]:  # 判断当前节点是否被更新过
            continue

        for neighbor, weight in graph[current_node].items():  # 遍历邻居节点
            distance_to_neighbor = current_distance + weight
            if distance_to_neighbor < distance[neighbor]:  # 更新距离
                distance[neighbor] = distance_to_neighbor
                heapq.heappush(queue, (distance_to_neighbor, neighbor))

    return distance

# 测试代码
graph = {
    'A': {'B': 5, 'C': 1},
    'B': {'A': 5, 'C': 2, 'D': 1},
    'C': {'A': 1, 'B': 2, 'D': 4, 'E': 8},
    'D': {'B': 1, 'C': 4, 'E': 3, 'F': 6},
    'E': {'C': 8, 'D': 3},
    'F': {'D': 6}
}

start = 'A'
distance = shortestPath(graph, start)
print(distance)

以上代码使用了Dijkstra算法来求从'A'顶点到其他所有顶点的最短路径。其中,图用字典存储,每个节点用字典存储其邻居节点及其权值。距离用字典存储,起点到每个顶点的距离初始值为无限大,未遍历的节点使用堆存储。