码迷,mamicode.com
首页 > 编程语言 > 详细

python 实现dijkstra算法求解最短路径

时间:2020-03-02 22:25:27      阅读:86      评论:0      收藏:0      [点我收藏+]

标签:key   ==   python   最短路   顶点   for   map   visit   turn   

? 重点:dijkstra算法按层计算其余点到源点的最短距离,层层扩展。

1. dijkstra算法

  • 求解目标:找到图中源点到其余点的最短距离,是单源点最短距离算法。
  • 整体思路:每一步都寻找到与源点最近的点,层层扩展,是贪心算法。
  • 具体实现:
    • 输入:给定一个图的邻接表M,源点u。
    • 辅助变量:存储与源点最短距离的字典、存储已访问节点的集合。
    • 算法过程:
      1. 初始化:将源点加入已访问集合
      2. 对已访问集合中每个点的所有邻接点,计算与源点的最短距离存入字典和已访问集合。
      3. 重复2,直至所有顶点被访问

2. 求解两点最短路径

? 利用dijkstra算法,可以找到图中源点到其余点的最短距离。而求解两点间最短路径,只需找到两点的最短距离和路径。因此只需要在dijkstra算法中增添一个判断语句即可得到两点间最短距离。

def dijkstra(adjoin_map, u, v):
    '''给定一个图的邻接表M,两点u和v,该代码能返回两点间的最短路径和距离。
    :param adjoin_map: {node: [(node1, weight), (node2, weight2)]}
    :param u:
    :param v:
    :return: 损失
    '''
    if u == v:
        return 0
    cost_dct = {u: 0}  # 与源点的最短距离
    to_visited_set = {u}  # 需要访问的集合
    find_status = False
    while not find_status:
        # 每次迭代扩展一层节点
        cur = to_visited_set.pop()
        for adjoin, cost in adjoin_map[cur]:
            # 计算最短距离
            cost_after = cost_dct[cur] + cost
            if adjoin in cost_dct.keys():
                if cost_after < cost_dct[adjoin]:  # 情况1:如果已访问且距离更短,则更新距离
                    cost_dct[adjoin] = cost_after
            else:  # 情况2:未访问,则加入
                cost_dct[adjoin] = cost_after
                to_visited_set.add(adjoin)
            if adjoin == v:  # 找到则跳出
                find_status = True
                break
    if v in cost_dct.keys():
        return cost_dct[v]
    return None

若需要保存最短路径,则只需要增加一个字典,用来保存每个节点的前驱节点。

python 实现dijkstra算法求解最短路径

标签:key   ==   python   最短路   顶点   for   map   visit   turn   

原文地址:https://www.cnblogs.com/vvlj/p/12398130.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!