概要
狄克斯特拉算法是从一个顶点到其余各顶点的最短路径算法,用于不包含负边的有权图中的单源最短路径问题。
类似于BFS(宽度优先搜索)。
方法
- 准备priority_queue(优先级队列),push起点和到其的最短距离的信息(起点为00, 其他顶点为∞)。因为使用了优先级队列,所以信息以最短距离顺序排序。
- 重复以下的操作,直到优先级队列为空集。
- 提取优先级队列的先头元素(距离最短的元素)
- 如果所提取的元素中包含的距离信息大于所记录的最短距离,则该操作终止,并且操作返回到提取前导元素的操作。
- 扫描可以从那里移动的顶点,如果有可以更新最短距离的顶点,则更新该距离,然后将把走到该顶点的距离,顶点的信息push到优先队列。
复杂度为O(ElogV)。
伪代码
// V: 顶点集
// Q: 优先级队列 元素由(距离,目前到达顶点)构成
// d(v): 距起始顶点的最短路径的长度
// prev(v): 走最短路径时的前一个顶点
// 初始化
for (v <- V)
d(v) <- (如果v=s代入0,其他代入∞)
prev(v) <- (没有)
Q(v) <- d(v)
// 计算
while ( Q不是空集 )
从Q中取出Q(u)最小的顶点u
if d(u) < 取出元素的距离
for each ( 与顶点u存在相连接的边的顶点v(属于V) )
alt <- d(u) + length