Dijkstra求最短路(单源最短路,边权为正)
给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为正值。
请你求出 1 号点到 n 号点的最短距离。
算法步骤
a. 初始化 dist[1] = 0, dist[i] = +inf S:当前已经确定为最短距离的点
b. for(int i = 1; i <= n; i ++)
{
1. 寻找不在 S 中距离源点最近的点 t
2. 将 t 加到 S 中
3. 用 t 更新其他点的距离(dist[j] = min(dist[j], dist[t] + g[t][j]))
}
时间复杂度 n方
正确性证明
https://blog.csdn.net/CrazyKeyboardMan/article/details/78219970
基于贪心
提醒:这里读者一定要反复仔细体会Lk
的含义,它不断更新的过程正是Dijkstra算法“由近及远,层层扩展”特点的体现。同时思考一下之前提过的“找到一个点后,该点Lk值肯定不会被更改”的原因(理解Lk的含义后,原因其实是显而易见的)。
以该点去松弛别的点(!st[i] 未使用过) 该点被标记位true 之后不会被松弛故之后不会被更改。
好吧,直觉上感觉是对的,每次找最小,再由最小去松弛,所有点更新完后,算法结束。
朴素版
1 |
|
优化版
找最小值(优先队列)和松弛操作(邻接表)优化
1 |
|