最短路径算法:迪杰斯特拉(Dijkstra)

 前言:

        迪杰斯特拉算法是求解从一点出发到其他点的所有的最短路径的算法。简单来说:若一个图有(V_{1},V_{2},V_{3},V_{4},V_{5},V_{6})6个顶点,那么求解的是从V_{1}点出发,分别到V_{2},V_{3},V_{4},V_{5},V_{6}点的最短路径。

问题:

下图,从顶点V_{1}到其他各个顶点的最短路径。

(S+T=V)集合V是全集,集合T是我们需要的。T的范围是从空集到全集V,S的范围是从V全集到空集。

 刚开始S={V_{1},V_{2},V_{3},V_{4},V_{5},V_{6}},T={},V={V_{1},V_{2},V_{3},V_{4},V_{5},V_{6}}

                                             

求解:

首先,我们定义一个数组Dis,数组长度和顶点个数一样,6个点,数组长度就是6,数据里面存V_{1}到这个点的距离,所以第一个值肯定是0,表示自己到自己的距离为0。

  • 第1次:从V_{1}出发,能到哪里的就把距离写下来,到不了的就写正无穷(最小值加入集合)

          

         说明:只能走一步,从V_{1}出发,V_{1}V_{2}距离为\infty,因为到不了,V_{1}V_{3}距离为10,其他依次类推。因此,我们发现,V_{1}V_{3}的距离最短,因为你不可能做到(通过其他节点到V_{3},而且距离还比10更小)。所以T集合={V_{1}V_{3}}  ,且记下路线最短路径(V_{1}---->V_{3})。S集合={V_{2}V_{4}V_{5}V_{6}}

注:T集合用绿色标记,更新的距离用红色标记 

 

 

  • 第2次:从V_{1}出发,确定经过由上一个结点中转的路线。(也就是说,这个时候可以通过V_{1}-->V_{3}-->其他点)

          

          说明:从第一步我们已经知道,可以借助V_{3}这个点达到其他点。因为V_{3}能到V_{4},而且距离是50,所以我们发现,如果从V_{1}出发,通过V_{3}到达V_{4},距离就可以变成10+50=60。10表示从V_{1}V_{3}的距离,50表示V_{3}V_{4}的距离。很不巧,V_{3}只能到V_{4},所以我们只能更新数组中V_{4}的值,从\infty变成了60,也就是上述数组中的红色数字60。但是并不是说,V_{1}V_{4}的最短路径就是60,我们只是更新了一下距离而已,更新完距离就要更新T集合。T集合会加入S集合中,最短的那个点。S集合= {V_{2}V_{4}V_{5}V_{6}},很显然V_{5}加入了T。此时T集合={V_{1},V_{3},V_{5}},且记下路线(V_{1}---->V_{5})。S集合={V_{2}V_{4}V_{6}}

 

  • 第3次:找到S集合中最小的值,(加入T集合)+(更新S集合的值)

        

        说明:T集合={V_{1},V_{3},V_{5}},S集合={V_{2}V_{4}V_{6}}。所以现在需要更新{V_{2}V_{4}V_{6}}的距离,经过计算,不管通过{V_{1},V_{3},V_{5}}哪个点到V_{2},都是不可达到,所以Dis[1]=\infty,从{V_{1}-->V_{5}--->V_{4}}的距离为50,50比60小,所以可以更新Dis[3]的距离。同理,{V_{1}-->V_{5}--->V_{6}}的距离为90,比100小,更新Dis[5]的值。S集合中有资格加入T集合的是V_{4}。此时T集合={V_{1},V_{3},V_{5},V_{4}},且记下路线(V_{1}---->V_{5}---->V_{4})。S集合={V_{2},V_{6}}

 

  •  第4次:找到S集合中最小的值,(加入T集合)+(更新S集合的值)

         

       说明:根据上述步骤,发现不管通过T集合中哪个点到V_{2},都无法达到,则Dis[1]=\infty,通过(V_{1}---->V_{5}---->V_{4}---->V_{6})可以发现距离为60,60小于原来的值90,所以需要更新距离。S集合={V_{2},V_{6}},有资格加入T集合的点V_{6}。此时T集合={V_{1},V_{3},V_{5},V_{4},V_{6}},且记下路线(V_{1}---->V_{5}---->V_{4}---->V_{6})。S集合={V_{2}}

 

  •  第5次:找到S集合中最小的值,(加入T集合)+(更新S集合的值) 

        

       说明:不管通过T集合中哪个点到V_{2},都无法达到,则Dis[1]=\infty。此时T集合={V_{1},V_{3},V_{5},V_{4},V_{6},V_{2}},S集合=空集。圆满结束。

 

 总结:

起点

终点

最短路径

长度

v1

V3

{v1,v3}

10

 

V5

{v1,v5}

30

 

V4

{v1,v5,v4}

50

 

V6

{v1,v5,v4,v6}

60

 

v2

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值