前言:

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

问题:

下图,从顶点最短路径算法:迪杰斯特拉(Dijkstra)到其他各个顶点的最短路径。

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

 刚开始S={最短路径算法:迪杰斯特拉(Dijkstra),最短路径算法:迪杰斯特拉(Dijkstra),最短路径算法:迪杰斯特拉(Dijkstra),最短路径算法:迪杰斯特拉(Dijkstra),最短路径算法:迪杰斯特拉(Dijkstra),最短路径算法:迪杰斯特拉(Dijkstra)},T={},V={最短路径算法:迪杰斯特拉(Dijkstra),最短路径算法:迪杰斯特拉(Dijkstra),最短路径算法:迪杰斯特拉(Dijkstra),最短路径算法:迪杰斯特拉(Dijkstra),最短路径算法:迪杰斯特拉(Dijkstra),最短路径算法:迪杰斯特拉(Dijkstra)}

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

求解:

首先,我们定义一个数组Dis,数组长度和顶点个数一样,6个点,数组长度就是6,数据里面存最短路径算法:迪杰斯特拉(Dijkstra)到这个点的距离,所以第一个值肯定是0,表示自己到自己的距离为0。

  • 第1次:从最短路径算法:迪杰斯特拉(Dijkstra)出发,能到哪里的就把距离写下来,到不了的就写正无穷(最小值加入集合)

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

         说明:只能走一步,从最短路径算法:迪杰斯特拉(Dijkstra)出发,最短路径算法:迪杰斯特拉(Dijkstra)最短路径算法:迪杰斯特拉(Dijkstra)距离为最短路径算法:迪杰斯特拉(Dijkstra),因为到不了,最短路径算法:迪杰斯特拉(Dijkstra)最短路径算法:迪杰斯特拉(Dijkstra)距离为10,其他依次类推。因此,我们发现,最短路径算法:迪杰斯特拉(Dijkstra)最短路径算法:迪杰斯特拉(Dijkstra)的距离最短,因为你不可能做到(通过其他节点到最短路径算法:迪杰斯特拉(Dijkstra),而且距离还比10更小)。所以T集合={最短路径算法:迪杰斯特拉(Dijkstra)最短路径算法:迪杰斯特拉(Dijkstra)}  ,且记下路线最短路径(最短路径算法:迪杰斯特拉(Dijkstra)---->最短路径算法:迪杰斯特拉(Dijkstra))。S集合={最短路径算法:迪杰斯特拉(Dijkstra)最短路径算法:迪杰斯特拉(Dijkstra)最短路径算法:迪杰斯特拉(Dijkstra)最短路径算法:迪杰斯特拉(Dijkstra)}

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

 

 

  • 第2次:从最短路径算法:迪杰斯特拉(Dijkstra)出发,确定经过由上一个结点中转的路线。(也就是说,这个时候可以通过最短路径算法:迪杰斯特拉(Dijkstra)-->最短路径算法:迪杰斯特拉(Dijkstra)-->其他点)

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

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

 

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

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

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

 

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

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

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

 

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

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

       说明:不管通过T集合中哪个点到最短路径算法:迪杰斯特拉(Dijkstra),都无法达到,则Dis[1]=最短路径算法:迪杰斯特拉(Dijkstra)。此时T集合={最短路径算法:迪杰斯特拉(Dijkstra),最短路径算法:迪杰斯特拉(Dijkstra),最短路径算法:迪杰斯特拉(Dijkstra),最短路径算法:迪杰斯特拉(Dijkstra),最短路径算法:迪杰斯特拉(Dijkstra),最短路径算法:迪杰斯特拉(Dijkstra)},S集合=空集。圆满结束。

 

 总结:

起点

终点

最短路径

长度

v1

V3

{v1,v3}

10

 

V5

{v1,v5}

30

 

V4

{v1,v5,v4}

50

 

V6

{v1,v5,v4,v6}

60

 

v2

 

 

相关文章: