spfa算法_C++详解

spfa定义

SPFA算法的全称是:Shortest Path Faster Algorithm,该算法是西南交通大学段凡丁于1994年发表的,它可以在O(kE)的时间复杂度内求出源点到其他所有点的最短路径,其中k为所有顶点进队的平均次数,可以证明k一般小于等于2,可以处理负边,但无法处理带负环的图(负环和负边不是一个概念)。

特点(优点)

spfa可以判断图中是否有负环,可以计算负边。

spfa概念

我们记源点为start,由源点到达点i的“当前最短路径”为dist[i],开始时将所有dist[i]初始化为无穷大,dist[start]则初始化为0。算法所要做的,就是在运行过程中,不断尝试减小dist[]数组的元素,最终将其中每一个元素减小到实际的最短路径。

实现具体操作

我们要维护一个队列,开始时将源点置于队首,然后反复进行这样的操作,直到队列为空:

1、取出队首元素,记为t,扫描所有与节点t直接相连的点
2、扫描过程中不断对扫描到的点(记为E)做松弛操作,松弛操作的原理是著名的定理:“三角形两边之和大于第三边”,我们叫它三角不等式。所谓对i,j进行松弛,就是判定是否d[j]>d[i]+w[i,j],如果成立则将d[j]=d[i]+w[i,j],否则不动。
3、如果扫描到的节点没有在队列中,则需要将该节点入队列,原因是在步骤2中我们

你可能感兴趣的:(C++算法和数据结构,算法,c++,spfa,最短路)