Dijkstra算法的目的是寻找单起点最短路径,其策略是贪心加非负加权队列
一、单起点最短路径问题
单起点最短路径问题:给定一个加权连通图中的特定起点,目标是找出从该起点到图中所有其他顶点的最短路径集合。需要明确的是,这里关心的不仅仅局限于寻找一条从起点出发到任一其他顶点的单一最短路径;单起点最短路径问题要求的是一组路径,每条路径都从起点出发通向图中的一个不同顶点,当然,其中某些路径可能具有公共边。
二、Dijkstra算法原理
Dijkstra算法是一种高效地找出图中从一个给定起点到所有其他顶点最短路径的方法。它按照距离起点的远近顺序,逐步确定到各个顶点的最短路径。具体来说,算法首先找到距离起点最近的顶点,并确定它们之间的最短路径;然后,它接着寻找下一个最近的顶点,依此类推。在第 iii 次迭代之前,算法已经确定了到达最近的 i−1i-1i−1个顶点的最短路径,这些顶点及其路径构成了原图的一个子图,形成一棵以起点为根的树。
重要的是,由于图中所有边的权重都为非负,算法能够保证每次迭代找到的是当前可达顶点中距离起点最近的一个。这些待选顶点,称为“边缘顶点”,位于已构建的子树的外围。理论上,图中的所有其他顶点也可以被视为边缘顶点,但它们与树中顶点的连接权重被假设为无限大。
为了求出下一个最接近起点的顶点,Dijkstra算法计算每个边缘顶点至其最近的树内顶点的距离(即该边的权重),并将此距离与从起点到该树内顶点的已知最短路径长度相加。在所有这些候选顶点中,算法选择总和最小的顶点作为下一个最近顶点。Dijkstra算法的核心在于,通过仅对这些特定的候选路径进行比较,就可以有效地找到最短路径。
三、Dijkstra算法应用
为了简化算法的实施过程,我们为每个顶点引入两个辅助标记。第一个标记是一个数值标记 ddd,它记录了从算法开始到当前为止,从起点到该顶点的最短路径长度。随着算法的进行,当新的顶点被加入到树中时,ddd 的值更新为从起点到这个新顶点的最短路径长度。第二个标记则记录了该路径上的倒数第二个顶点,即当前构建的树中该顶点的父节点(对于起点以及那些尚未与树中的顶点直接相连的顶点,这个标记不必指定)。有了这两个标记后,寻找下一个最近顶点 u∗u^{ *}u∗ 变得相对直接:我们仅需在所有边缘顶点中找到具有最小 ddd 值的顶点即可,而这个查找过程的顺序并不重要。这样,这两个标记极大地简化了算法的步骤,使得确定最短路径的过程更加高效和直观。
在确定了加入树中的顶点u*以后,还需要做两个操作:
-
把 u∗u^{ *}u∗ 从边缘集合移到树顶点集合中。
-
对于余下的每一个边缘顶点 uu

最低0.47元/天 解锁文章
499

被折叠的 条评论
为什么被折叠?



