【迪杰斯特拉算法思想】
设有两个顶点集合S和T,集合S中存放图中已找到最短路径的顶点,集合T存放图中剩余顶点。初始状态下,集合S中只包含源点V0。然后不断从集合T中选取到顶点V0路径长度最短的顶点Vu并入集合S中。集合S中每次并入一个新的顶点Vu后,都要修改顶点V0到集合T中顶点的最短路径长度值。不断重复此过程,直到集合T中的顶点全部并入集合S中为止。
【深入理解】
当集合T中的顶点Vu并入集合S中时,Vu被确定为最短路径上的顶点,此时Vu就像V0到达集合T中顶点的中转站,即从V0到集合T中顶点的路径条数随着顶点Vu从集合T并入到集合S中后会增加,而这些新出现的路径很有可能比原有的V0到集合T中的顶点的路径长度小,因此需要修改原有V0到集合T中的其他顶点的路径长度。对于此时集合T中的顶点Vk来说,V0不经过Vu到Vk的路径长度(即原有的路径长度)为a,另一种是V0经过Vu到Vk的路径长度(即新的路径长度)为b。此时存在两种情况:
第一:a <= b。此时什么都不做。
第二:a > b。则用b来代替a作为V0到Vk的路径长度。
【实现迪杰斯特拉算法的辅助数据结构】
为了实现迪杰斯特拉算法,需要用到3个辅助数组:dist[]、path[]和set[]。
dist[Vi]表示当前已找到的从V0到每个终点Vi的最短路径长度。初始状态:若从V0到Vi有边,则dist[Vi]为边上的权值,否者置dist[Vi]为无穷大。
path[Vi]中保存V0到Vi最短路径