问题描述:
给定一个带权有向图G=(V,E),其中每条边的权是一个实数。另外,还给定V中的一个顶点,称为源。现在要计算从源到其他所有各顶点的最短路径长度。这里的长度就是指路上各边权之和。这个问题通常称为单源最短路径问题。
算法描述:
求解单源最短路径问题可以使用的算法有Dijkstra算法,Bellman-Ford算法,Floyd算法和SPFA算法等,这里采用Dijkstra算法对该问题进行求解。
这个算法是通过为每个顶点 v 保留目前为止所找到的从s到v的最短路径来工作的。初始时,原点 s 的路径权重被赋为 0 (d[s] = 0)。若对于顶点 s 存在能直接到达的边(s,m),则把d[m]设为w(s, m),同时把所有其他(s不能直接到达的)顶点的路径长度设为无穷大,即表示我们不知道任何通向这些顶点的路径(对于所有顶点的集合 V 中的任意顶点 v, 若 v 不为 s 和上述 m 之一, d[v] = ∞)。当算法结束时,d[v] 中存储的便是从 s 到 v 的最短路径。
求解思路:
该算法的核心思想是贪心,即每次寻找最小的点之后更新该点的周围的点,因此它只适用于不含负权边的问题的求解。
首先,寻找出最小的点x,其次,遍历x的所有出边(x,y,z),若dis[y] > dis[x] + z,则令dis[y] = dis[x] + z。重复这两步操作,最终算法结束,可得到所有点的最短路径。