适用范围
图论里面另外三个常用算法都是以外国人的名字命名的,我很好奇spfa是什么意思,一去查发现是shortest path faster algorithm,还是我校西南交通大学的老师命名的,哈哈自豪感油然而生。
spfa其实就是用队列对bellman-ford算法进行了优化,因为bellman-ford算法不仅对前一次改变了距离的点进行了遍历,对上一次距离没有变动的点也进行了遍历(这就浪费了时间)。而spfa算法就是在bellman-ford算法的基础上增加了了一个队列,利用队列存储上一次更新了距离的点。
可以适用于单源最短路,权值可以为负的情况下求最短路。
求负环
spfa算法的另外一个作用就是可以求图中是否存在负环
增加一个cnt数组记录每个点到源点的边数,一个点被更新一次就+1,一旦有点的边数达到了n那就证明存在了负环。
AC代码
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
typedef pair<int,int> PII; //记住define不需要 但是typedef需要
const int N=100010;
int n,m;
int e[N],ne[N],w[N],h[N],idx;