SPFA算法
1.SPFA 是 Bellman-Ford 算法 的一种优化算法,用来求解 带权有向图 中 单源最短路径(可以有负权边,但不能有负权回路)。
2.算法流程:
以源点 s 为起点:
(1)初始化 dist[i] = INF,dist[s] = 0;
(2)建立一个队列 q,将 s 入队;
(3)当队列不空时:
取出队首顶点 u;
对所有出边 u -> v (w):
如果 dist[v] > dist[u] + w,更新 dist[v];
若 v 不在队列中,则将 v 入队;
(4)最终 dist[i] 即为源点到 i 的最短路径。
3.也可以用这个算法检测负环
当负环存在时,对负环内的节点,每次松弛总是能更新他的最短距离,所以可以用一个cnt数组记录每个节点入队的次数,当某个节点的入队次数>n时,说明存在负环。