迪杰斯特拉(Dijkstra)算法是求解“图”中单源最短路径的算法之一,所谓单源最短路径是指给定一个“初始节点”,求解其到其它各顶点的最短路径。git
为了方便描述,假设图中全部边的权重都不为负:算法
该图已经较简洁,而且方便对该算法进行描述:blog
假设1号节点为指定的开始节点,现欲求1号节点到二、三、4号各节点的最短路径。其中1号到2号节点的求解过程以下:get
(1)因为1号节点与二、三、4号节点直接相连的路径分别为w六、w五、w1(咱们将这几个路径放到一个临时的集合中,并试图从中选择一个到其它节点中路径最短的那个)。it
(2)若是临时集合中w6为其中的最短路径,则w6为最终结果,关键问题是w1 -> w4,w1 -> w3 -> w2,w5 -> w2,w5 -> w3 -> w4也是其他的4条路径。因此咱们假设(1)中w1为与1号节点直连路径中最短的那条(所以w1为1号节点和4号节点的最短路径,咱们将4号节点放入到最终的最短路径集合中)。im
(3)对于4号节点,除了直连的1号节点外,还有其他的2号节点和3号节点。若是w1 -> w4的路径和小于w6,那么临时集合中1号与2号节点的最短路径需更新为w1+w4(假设更新)。同理w1 -> w3的路径和小于w5,则临时集合中1号与3号节点的最短路径需更新为w1+w3(假设更新,注意咱们的目标是求1号到2号节点的最短路径,可是该算法会附带着求解到其它节点的最短路径)。img
(4)目前为止在临时集合中保存着1号节点分别到2号节点和3号节点的最短路径,现按照(2)的步骤从其中选择一条最短路径来,若是选择2号节点则为最终结果,若是选择3号节点则须要按照(3)的步骤进一步判断若是w1 -> w3 -> w2的路径和小于w1 -> w4则最终的最短路径更新为w1+w3+w2。集合
注意:以上就是该算法的全过程,并且前提条件是权重不为负。那么假设权重可能为负则该算法的第(1)步就不能实现,由于一开始就不能选择一个到其它节点中路径最短的那个节点,这是前提条件。固然该算法在真正实现的时候还须要考虑一下权重相等的状况,具体代码请参考我给出的开源实现:https://gitee.com/fat_mt/graph。co