前言
- SPFASPFA算法由于它上限 O(NM) = O(VE)O(NM)=O(VE)的时间复杂度,被卡掉的几率很大.在算法竞赛中,我们需要一个更稳定的算法:dijkstradijkstra.
什么是dijkstradijkstra?
- dijkstradijkstra是一种单源最短路径算法,时间复杂度上限为O(n^2)O(n2)(朴素),在实际应用中较为稳定;;加上堆优化之后更是具有O((n+m)\log_{2}n)O((n+m)log2n)的时间复杂度,在稠密图中有不俗的表现.
dijkstradijkstra的原理/流程?
- dijkstradijkstra本质上的思想是贪心,它只适用于不含负权边的图.
- 我们把点分成两类,一类是已经确定最短路径的点,称为"白点",另一类是未确定最短路径的点,称为"蓝点"
- dijkstradijkstra的流程如下::
- 1.1. 初始化dis[start] = 0,dis[start]=0,其余节点的disdis值为无穷大.
- 2.2. 找一个disdis值最小的蓝点x,x,把节点xx变成白点.
- 3.3. 遍历xx的所有出边(x,y,z),(x,y,z),若dis[y] > dis[x] + z,dis[y]>dis[x]+z,则令dis[y] = dis[x] + zdis[y]=dis[x]+z
- 4.4. 重复2,32,3两步,直到所有点都成为白点..
- 时间复杂度为O(n^2)O(n2)
dijkstradijkstra为什么是正确的
- 当所有边长都是非负数的时候,全局最小值不可能再被其他节点更新.所以在第22步中找出的蓝点xx必然满足:dis[x]:dis[x]已经是起点到xx的最短路径..我们不断选择全局最小值进行标记和拓展,最终可以得到起点到每个节点的最短路径的长度