📜  算法|图最短路径|问题13(1)

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

算法 | 图最短路径 | 问题13

在图论中,最短路径问题(Shortest Path Problem)是指在图中找到一条路径,使得该路径上经过的边权值之和最小。

算法思路

最短路径问题可以通过Dijkstra算法解决。Dijkstra算法是一种贪心算法,通过依次选择最短路径来找到起点到终点的最短路径。在Dijkstra算法中,需要维护一个节点列表,其中记录每个节点到起点的最短路径和相关边。我们通过不断更新节点列表中的信息,来最终得到起点到终点的最短路径。

代码实现

以下是一个使用Python实现Dijkstra算法来解决最短路径问题的例子:

import heapq

def dijkstra(graph, start, end):
    # 初始化节点列表,用于记录每个节点到起点的最短路径和相关边的列表
    nodes = [(0, start, [])]
    visited = set()
    while nodes:
        # 取出节点列表中路径最短的节点
        (cost, current, path) = heapq.heappop(nodes)
        # 如果该节点已被访问过,则跳过
        if current in visited:
            continue
        # 将该节点标记为已访问
        visited.add(current)
        # 如果该节点就是终点,则返回路径
        if current == end:
            return [*path, current]
        # 遍历该节点的所有邻居节点
        for neighbor, weight in graph[current].items():
            # 如果该邻居节点已被访问过,则跳过
            if neighbor in visited:
                continue
            # 计算该节点到该邻居节点的距离
            next_cost = cost + weight
            # 更新邻居节点的最短路径和相关边的列表
            next_path = path + [current]
            heapq.heappush(nodes, (next_cost, neighbor, next_path))
    # 如果无法找到从起点到终点的路径,则返回空列表
    return []
示例使用

假设有如下无向图:

    A
   / \
  5   2
 /     \
B------C
 \     /
  1   4
   \ /
    D

我们希望从节点A到节点D的最短路径,可以使用如下代码获得:

graph = {
    'A': {'B': 5, 'C': 2},
    'B': {'A': 5, 'C': 1, 'D': 1},
    'C': {'A': 2, 'B': 1, 'D': 4},
    'D': {'B': 1, 'C': 4}
}

path = dijkstra(graph, 'A', 'D')
print(path)

输出结果为:

['A', 'C', 'D']

即从节点A到节点D的最短路径为A -> C -> D,路径长度为6。