SPFA算法定理:当存在最短路径时,上述SPFA算法必须能够找到最短路径值。证明:每次将点放在团队的尾部时,都是通过松弛操作实现的。换句话说,每个队列优化将减少特定点 v 处的最短路径估计 d [v]。因此,SPFA 算法的执行将使最短路径估计值 d 越来越小。由于我们假设图形中没有负权重循环,因此每个节点具有最短的路径值。因此,算法不会无限期地执行。当 d 值逐渐减小时,算法在达到最短路径值时结束。此时的最短路径估计值是相应节点的最短路径值。<br>事实上,如果某个点进入队列 n 次,则表示图形中有一个负环,并且没有最短路径。<br>对SPFA算法的非常直观的理解来自非加权图形的BFS。在非加权图中,BFS 到达的第一个顶点经历的路径必须是最短路径(即通过的最小顶点数),因此在此,为了避免最坏的情况,应在正权重图上使用更高效的 Dijkstra 算法。如果给定的图形具有负权重边缘,则像 Dijkstra 算法这样的算法将毫无用处,SPFA 算法将派上用场。简而言之,当加权定向图 D 中没有负权重环时,必须存在最短路径。使用数组 d 记录每个节点的最短路径估计,并使用邻接表存储图形 D。我们采用的方法是动态近似法:设置先出队列以保存要优化的节点,并在优化过程中每次拿出团队的第一个节点u,并使用您当前的最短路径估计值离开u 指向节点v执行松弛操作。如果调整了点 v 的估计最短路径,并且点 v 不在当前队列中,则点 v 放在队列的末尾。这样,节点会不断从队列中取而出,以执行松弛操作,直到队列为空。
正在翻譯中..
