求解单源最短路的Dijkstra算法
Dijkstra算法1,英文为Dijkstra’s algorithm,常被译为迪杰斯特拉算法。该算法由Edsger Wybe Dijkstra2在1956年发现。Dijkstra算法使用类似BFS的方法解决带权无负权图的单源最短路问题。
算法描述
解决单源最短路,便是需要求解图上某个源点到其它点的权值和最小的路径,这里显然有两个重要求解目标——权值和、路径,这里我们先不考虑具体路径的求解。
解集dist初始化
Dijkstra算法在过程中动态维护解集,其中为当前到编号为的点之间的最小权值和。显然在算法开始前,有
松弛
Dijkstra的基础操作是松弛。显然对于任意时刻,如果存在一条边,使得当前,则可利用该边,将之前的解路径优化为。
贪心地进行松弛操作
算法维护两个顶点集合和。集合保留所有已知实际最短路径值的顶点,而集合则保留其他所有顶点。集合初始状态为空,而后每一步都有一个顶点从移动到。这个被选择的顶点是中拥有最小的值的顶点。当一个顶点从中转移到了中,算法对的每条邻边进行松弛。
由于初始时为最小,故第一轮中的松弛其实是将初始化为,整个算法将进行轮松弛。也有说法将第一轮松弛作为初始化的一部分,认为轮松弛即可得到结果。这是亟需辨析的点。
伪代码
《算法导论》给出了以下伪代码:
求解单源单汇点
显然上述流程中,一旦对汇点的松弛完成,则意味着最终的已经求得,此时可以终止算法。但该操作并不会降低算法的渐进复杂度,因为该汇点可能在最后一个才被选中进行松弛。