通俗算法讲解之图最短路径——Dijkstra算法

来源:互联网 发布:淘宝怎么追加评价手机 编辑:程序博客网 时间:2024/05/16 10:54

原理说明

在解决有向图的最短路径算法时,无论是赋权图还是无权图,都需要维护一个表,该表有三个表项参数:known、d、p,

其中known是已知定点标记;

d为从初始点s开始,经过已知顶点到达当前顶点的最短路径长;
p表示引起d变化的最后的顶点。(下面会通过一个例子讲解说明以上3个表项的变化)

赋权图(正权值)最短路径算法的解决方法之一是Dijkstra算法,是一种贪婪算法,运用Dijkstra算法实现单源(单个起始顶点)最短路径问题的步骤为:

1、初始化表项,其中known初始化为0,d初始化为无穷大,p初始化为0;

2、选取一个源顶点(s),即起始顶点,记为顶点v1;(这一步s顶点即为定点v1说明源顶点是为了突出表项的初始化过程)

3、更新表项参数。第一,更新起始顶点known=1,d=0;第二,提取起始顶点的邻接点,更新相应邻接点的表项参数,将邻接点表项参数d更新为从顶点v1到该邻接点的路径长(权值),同时p=v1;(注意,这一步中表中的已知点还是只有初始顶点v1,v1的邻接点的konwn值并没有改变)

4、选取所有未知点中具有最小d值的点为下一个已知点;

5、重复第3、第4步。如果在这一步中,遇到邻接点是已知点,则对该顶点不做任何处理,跳转下一个邻接点,如果邻接点是未知点,但是该邻接点的参数d不是无穷大,即从起始点到该顶点有一个路径长,则需要比较当前更新值与其已经存在的d值,选取小的d值(因为目的是求取最短路径),同时更新相应p值;

6、直到所有顶点known值为1,算法结束,通过跟踪p值,可以显示某一顶点与源顶点之间的最短路径。


实例讲解

有向图如下:


步骤1、2:初始化表并选取v3为源顶点


步骤3:根据顶点v3的邻接点v2、v4更新表


步骤4:选取邻接点v2、v4中d值较小的顶点即为已知点,known=1


步骤5:重复步骤3、4,过程如下




1 0
原创粉丝点击