Dijkstra最短路径

回顾下最短路径算法,感觉找了一堆没有写的特别简单明了的,还是辗转看了好几个人的才找到一个写的很清楚的,这里再总结一下方便以后自己回顾。


有向图.png

以上面的图为例,找0到其他1-6个点的最短路径。
start表示从该路径开始,第一行表示1-6的每个节点,中间值表示从start到每个节点的路径长度

start   1      2      3      4       5        6
  0     4      6      6      -1     -1       -1 

1) 初始从0开始,发现与0直接相连的1,2,3,路径长度分别为4,6,6,填入表中,-1表示从start节点直接到该点是无法到达的;
2)从表中来看,走到的只有0节点,1,2,3,4,5,6节点都没有涉及,因此我们需要选择一个点为跳板,来达到其他节点。那么按照dijkstra的贪心思想,选择当前路径最短的作为跳板,即下一个节点从1开始,那么start表示成0-1,找1的邻接边,这时1已经不需要考虑了,考虑到达的其他就可以了;

start   1(已遍历)   2      3      4       5        6
  0     4          6      6      -1     -1       -1 
0->1               5             11   

接来下看,1已经我们已经找过了,只能到达2和4,这时发现从0到1再到2的路径比0到2的路径短,更新长度,0到2的长度从6变成了5,0到4的长度变成了11,这时1已经走完了,从表中再找跳板,发现2的路径最短,因此下一步我们从2开始找;
2的邻接节点是4,5,更新表;

start   1(已遍历)   2(已遍历)      3       4       5        6
  0         4          6          6      -1      -1       -1 
0->1                   5                 11   
0->1->2                                  11       9

回顾全表,还有3,4,5,6 节点没有用上,目前最短的路径是从2开头的长度为5(为什么不选择1,因为1已经在前面选择过了,所以不考虑),所以现在从2开始找到的点是4和5,更新表;
看到目前最短的路径是6,从3作为跳板,找3的邻接边,分别是2,5,更新表;

start   1(已遍历)   2(已遍历)      3(已遍历)       4       5        6
  0         4          6          6             -1      -1       -1 
0->1                   5                        11   
0->1->2                                         11       9
0->1->2->3             8                                 12

节点还没有找完(怎样算找完呢?直到所有的点都作为跳板后找不到其他路径了才算完),还有4,5,6,这时看表,最短是节点5(剩下的点里找最短的,已经遍历过的不再考虑),长度为9,路径为0,1,2,5,从5开始,找邻接点,更新表;

start   1(已遍历)   2(已遍历)      3(已遍历)       4       5(已遍历)        6
  0         4          6          6             -1         -1           -1 
0->1                   5                        11   
0->1->2                                         11          9
0->1->2->3             8                                    12
0->1->2->5                                      10                       17

还有4,6,没有遍历,目前最短的是4,长度为10,从4开始,更新表;

start   1(已遍历)   2(已遍历)      3(已遍历)       4(已遍历)       5(已遍历)        6
  0         4          6          6                -1             -1            -1 
0->1                   5                           11   
0->1->2                                            11              9
0->1->2->3             8                                           12
0->1->2->5                                         10                           17
0->1->2->5->4                                                                   16

再遍历6;

start   1(已遍历)   2(已遍历)      3(已遍历)       4(已遍历)       5(已遍历)        6(已遍历)
  0         4          6          6                -1             -1            -1 
0->1                   5                           11   
0->1->2                                            11              9
0->1->2->3             8                                           12
0->1->2->5                                         10                           17
0->1->2->5->4                                                                   16
0->1->2->5->4->6

从表中可以看出全部节点都已遍历完毕,总结一下,
0->1: 最短路径为4;
0->2:最短路径为5,经过0->1->2;
0->3: 最短路径为6;
0->4:最短路径为10,经过0->1->2->5->4;
0->5: 最短路径为9,经过0->1->2->5;
0->6:最短路径为16,经过0->1->2->5->4->6;
总结一下:
1)每次从跳板得到的新的路径都要与之前保存的路径相对比,表中至始至终只需要存储最短的长度;
2)每次从最短的路径开始找,找完遍历一个节点后,再回去找剩余表中最短的点,再重复;

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。它的主要特点是以起始点...
    WebGiser阅读 560评论 0 2
  • 图论中最有名的问题可能就属最短路径了。最短路径问题要求解的是:如果从图中某一顶点(称为源点)到达另一顶点(称为终点...
    鹏抟九万阅读 10,628评论 3 24
  • Dijkstra算法是给定一个起点也就是原点,然后该原点通过与它临近的顶点不断向外扩张,最终得到该原点到其它所有顶...
    lambdacalculus阅读 4,418评论 1 3
  • Dijkstra 的最短路径算法在继续之前,建议简要了解邻接矩阵和BFS 迪克斯特拉算法 (打开新窗口)称为单源最...
    Python_Camp阅读 274评论 0 0
  • 前言 Dijkstra算法是应用于图中单源最短路径的搜索。我在这记录下我在学习该算法时的一些想法、理解与总结。首先...
    STrawberryer阅读 1,426评论 0 0

友情链接更多精彩内容