狄克斯特拉算法包含四个步骤:算法
1·找出“最便宜的节点,便可在最短期内到达的节点”spa
2·更新该节点的邻居的开销搜索
3·重复这个过程,直到对图中的每一个节点都这样作时间
4·计算最终路径
1·第一步:找出最便宜的节点。你如今站在起点,不知道应该前往A节点仍是B节点,那么前往这两个节点应该花费多长时间呢?(开始选定一个起点)假设前往节点A须要6分钟,而前往节点B须要2分钟,至于前往A和B以后的那些节点要花费的时间,如今你还不知道,并且因为你还不知道前往终点的时间,所以你假设为无穷大。如今来看从起点前往节点B是最短的用时(2分钟)
2·第二步:计算经节点B前往它的各个邻居须要花费的时间。对于节点B的邻居,若是找到前往它的更短的路径,就更新其开销
3·第三步:重复。重复第一步:找出可在最短期内前往的节点,你如今对节点B执行了第二步,除了节点B外,可在最短期内前往的节点是节点A。重复第二步:更新节点A的全部邻居的开销
当你对每一个节点都使用狄克斯特拉算法,你会发现
1·从起点前往节点B须要2分钟
2·从节点B前往节点A须要5分钟
3·从节点A前往终点须要6分钟
# 须要注意的是:若是咱们使用广度优先搜索,找到的“最短路径”将不是上述的这条,由于这条路包含了3段,而从新来看的话有一条路径从起点到终点一共只有2段
# 咱们使用广度优先搜索来查找2点之间的最短路径,那时的“最短路径”的意思是段数最少。而在狄克斯特拉算法中,给每一段路径都分配了一个“时间数值”所以狄克斯特拉算法找出的是总权重最小的路径
# 狄克斯特拉算法背后的关键理念是:找出图中最便宜的节点,并确保没有到该节点更短的路径
# 固然这里所说的最短路径并不必定指的是物理距离,也多是让某种度量指标最小
再重复一下狄克斯特拉算法的4个步骤:
1·找出最便宜的点,便可在最短期内前往的节点。
2·对于该节点的邻居,检查是否有前往它们的更短的路径,若是有这种路径,就更新其开销。
3·重复这个过程,直到对途中的每一个节点都这样作了
4·计算最终路径(后面的随笔会解释是如何计算最终路径的)
分析与起点(令起点为父节点)相连的几条岔路后,再肯定第二个隘口(记录花销)(将第二个隘口做为新的父节点,后面同理),以后再分析从第二个隘口前往第三个(也是分析与第二个隘口相连的几条岔路后决定第三个隘口)隘口的花销......重复上述步骤,直到到达终点,将前面从起点到第二个隘口,从第二个隘口到第三个隘口,等等的花销进行累加。
当“顺序走彻底程”并进行逐路分析后,为了肯定最终的路径,由终点,一个隘口,一个隘口的进行回溯,最终到达起点,才能肯定最终的路线(即由子节点找父节点)
# 实现代码以下: