朴素 dijkstra 算法
朴素 Dijkstra 算法
时间复杂度
- $O(n^2)$
算法应用情景:
- 不含有负权边的图中
整体思路:
- 初始化,将起点加入已更新的点中,并将起点的
dist
设为 0,其余点的dist
为 INF,代表没更新 - 循环
n - 1
次,每次更新一个点, - 用这个点更新其他点到起点的距离
如图所示:
模板代码如下:
1 | int g[N][N]; // 邻接矩阵,存储每条边 |
个人理解:
$Dijkstra$ 算法严格规定一个点出队即为这个点的最短路,若一个点出队后,之后的点中有负权边,则之前的点应该被更新,但这个点已经出队,无法被更新,所以 $Dijkstra$ 系列算法都无法处理负权边的情况。
具体证明:
- 如何证明最短路?仅需证明路径中的每一步都为当前的所有可行的道路中的最小值即可,每一步都最小,则所有步相加,必定可以使得结果最小,
- $Dijkstra$ 算法正是如此,基于贪心的原理,每一次所走的路为当前可走的路中的最小值,所以可以增明最短路,
- 此外,还可以证明的是当一个点出队时,当前值即为从起点到该点的最短路,思路由数学归纳法可知,和证明终点为最短路类似,令该点为终点,可发现代码实现和原代码如出一辙,由此得证
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Moench 的算法宝库!