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

以上面的图为例,找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)每次从最短的路径开始找,找完遍历一个节点后,再回去找剩余表中最短的点,再重复;