华南理工大学无线电爱好者协会软件小组美妙的算法程序员

Dijkstra 算法

2017-06-03  本文已影响369人  廖少少

Dijkstra 算法

前言

准备工作

算法描述

Python 实现 Dijkstra 算法

测试

算法详解

思路:

  1. q, seen = [(0,from_node,())], set()

    • q 记录了中间点 v 与 U 集合中哪些点邻接,这些邻接点为 k1、k2...,并且在 q 中的存储形式为:[(cost1,k1,path1),(cost2,k2,path2)...]

    • seen 就是算法描述部分提到的 V 集合,记录了所有已访问的点

  2. (cost,v1,path) = heappop(q)

    • 这行代码会得到 q 中的最小值,也就是在算法描述部分提到的 k,用算法描述为:cost=min(cost1,cost2...)
  3. seen.add(v1)

    • 这行代码对应算法描述的“ k 加到 V 集合中,将 k 从 U 集合删除”

    • 这个时候的 k 已经成为了中间点 v

  4. 查找 U 集合中所有与中间点 v 邻接的点 k1、k2... :

         for v2,c in graph_dict.get(v1, ()):
             if v2 not in seen:
                 heappush(q, (cost+c, v2, path))
    
    • 把 k1、k2... push 进入 q 中,回到第 2 点

利用 dijkstra 得到图中所有最短路径

源码:https://github.com/edisonleolhl/DataStructure-Algorithm/blob/master/Graph/ShortestPath/dijkstra.py

上一篇下一篇

猜你喜欢

热点阅读