SPFA算法是从Bellman-Ford算法使用队列优化而来的,可以用来判断是否存在负环,期望时间复杂度为O(kE),k是一个常数,一般不超过2,算法比较高效
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
const int MAXV = 200;
const int INF = 0x3f3f3f3f;
struct Node {
int v, dist;
};
vector<Node> Adj[MAXV];
int n, dis[MAXV],num[MAXV];//n为顶点数,num数组记录顶点的入队次数
bool inq[MAXV];//判断顶点是否在队列中
bool SPFA(int s)
{
//初始化部分
fill(dis, dis + MAXV, INF);
fill(inq, inq + MAXV, false);
fill(num, num + MAXV, 0);
//源点入队
queue<int> Q;
Q.push(s);
inq[s] = true;//顶点入队
num[s]++;//源点入队次数加1
dis[s] = 0;//源点的dis值为0
//主体部分
while (!Q.empty()) {
int u = Q.front();//队首顶点为u
Q.pop();
inq[u] = false;//设置u不在队列中
//遍历u的所有邻接边v
for (int j = 0; j < Adj[u].size(); j++)
{
int v = Adj[u][j].v;
int d = Adj[u][j].dist;
//松弛操作
if (dis[u] + d < dis[v]) {
dis[v] = dis[u] + d;
if (!inq[v]) {//如果v不在队列
Q.push(v);
inq[v] = true;
num[v]++;
if (num[v] >= n) return false;//有可达负环
}
}
}
}
return true;//无可达负环
}
int main()
{
system("pause");
return 0;
}