播客 > 搜索技术  >  最短距离Dijkstra算法  | 登录  | RSS订阅地址  | Code平台

最短距离Dijkstra算法

  Dijkstra算法是搜索树,图时候用到的搜索算法,带权图的最短路径问题即求两个顶点间长度最短的路径。,其中:路径长度不是指路径上边数的总和,而是指路径上各边的权值总和。路径长度的的具体含义取决于边上权值所代表的意义。例如在实际中求两个站点之间的最短距离,其中有多条通路,因为交通工具,例如地铁等,所以每个通路之间都有权重。
  其中最出名的是Dijkstra算法,其主要的思路是这样的,我先贴一张图片:按此在新窗口浏览图片,若按长度递增的次序生成从源点s到其它顶点的最短路径,则当前正在生成的最短路径上除终点以外,其余顶点的最短路径均已生成(将源点的最短路径看作是已生成的源点到其自身的长度为0的路径)。

按此在新窗口浏览图片

(2)算法基本思想
     设S为最短距离已确定的顶点集(看作红点集),V-S是最短距离尚未确定的顶点集(看作蓝点集)。
①初始化
     初始化时,只有源点s的最短距离是已知的(SD(s)=0),故红点集S={s},蓝点集为空。
②重复以下工作,按路径长度递增次序产生各顶点最短路径
     在当前蓝点集中选择一个最短距离最小的蓝点来扩充红点集,以保证算法按路径长度递增的次序产生各顶点的最短路径。
     当蓝点集中仅剩下最短距离为∞的蓝点,或者所有蓝点已扩充到红点集时,s到所有顶点的最短路径就求出来了。
  注意:
     ①若从源点到蓝点的路径不存在,则可假设该蓝点的最短路径是一条长度为无穷大的虚拟路径。
     ②从源点s到终点v的最短路径简称为v的最短路径;s到v的最短路径长度简称为v的最短距离,并记为SD(v)。

(3)在蓝点集中选择一个最短距离最小的蓝点k来扩充红点集
     根据按长度递增序产生最短路径的思想,当前最短距离最小的蓝点k的最短路径是:
     源点,红点1,红点2,…,红点n,蓝点k
 距离为:源点到红点n最短距离+<红点n,蓝点k>边长
     为求解方便,设置一个向量D[0..n-1],对于每个蓝点v∈ V-S,用D[v]记录从源点s到达v且除v外中间不经过任何蓝点(若有中间点,则必为红点)的"最短"路径长度(简称估计距离)。
     若k是蓝点集中估计距离最小的顶点,则k的估计距离就是最短距离,即若D[k]=min{D[i] i∈V-S},则D[k]=SD(k)。
     初始时,每个蓝点v的D[c]值应为权w<s,v>,且从s到v的路径上没有中间点,因为该路径仅含一条边<s,v>。
  注意:
     在蓝点集中选择一个最短距离最小的蓝点k来扩充红点集是Dijkstra算法的关键 

(4)k扩充红点集s后,蓝点集估计距离的修改
     将k扩充到红点后,剩余蓝点集的估计距离可能由于增加了新红点k而减小,此时必须调整相应蓝点的估计距离。
     对于任意的蓝点j,若k由蓝变红后使D[j]变小,则必定是由于存在一条从s到j且包含新红点k的更短路径:P=<s,…,k,j>。且D[j]减小的新路径P只可能是由于路径<s,…,k>和边<k,j>组成。
     所以,当length(P)=D[k]+w<k,j>小于D[j]时,应该用P的长度来修改D[j]的值。

(5)Dijkstra算法

 Dijkstra(G,D,s){
    //用Dijkstra算法求有向网G的源点s到各顶点的最短路径长度
    //以下是初始化操作
      S={s};D[s]=0; //设置初始的红点集及最短距离
      for( all i∈ V-S )do //对蓝点集中每个顶点i
          D[i]=G[s][i]; //设置i初始的估计距离为w<s,i>
       //以下是扩充红点集
      for(i=0;i<n-1;i++)do{//最多扩充n-1个蓝点到红点集
           D[k]=min{D[i]:all i V-S}; //在当前蓝点集中选估计距离最小的顶点k
           if(D[k]等于∞)
                return; //蓝点集中所有蓝点的估计距离均为∞时,
                     //表示这些顶点的最短路径不存在。
           S=S∪{k}; //将蓝点k涂红后扩充到红点集
           for( all j∈V-S )do //调整剩余蓝点的估计距离
               if(D[j]>D[k]+G[k][j])
                //新红点k使原D[j]值变小时,用新路径的长度修改D[j],
              //使j离s更近。
                   D[j]=D[k]+G[k][j];
          }
   }

参考文献:http://student.zjzk.cn/course_ware/data_structure/web/tu/tu7.5.2.htm

天气:大雨,ccdot发表于2007-12-28 14:26:31,阅读了3380次,共有个3回复.

说实话 一点都看不懂

niceidea post in 2008-1-1 22:27:10 #1  

学习中....

wknight post in 2008-3-4 22:06:25 #2  

谢谢

一二三 post in 2008-3-20 22:25:04 #3  
  1. 想要转载我文章的人滚远远的,能想多远,就滚多远。
  2. 不要提交任何带有网址URL信息的评论.
  3. 需要更多信息?请使用站内搜索,郁闷了?听听我在听什么吧!
用户名:*验证:看不清楚请点击刷新验证码*
内容: