#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
const int MAXV = 10010; //MAXV为最大顶点数
const int INF = 1000000000;
struct Node{
int v, dis; //v为邻接边的目标顶点,dis为邻接边的边权
};
vector<Node> Adj[MAXV]; //图G的邻接表
int n, d[MAXV], num[MAXV]; //num数组记录顶点的入队次数
bool inq[MAXV]; //顶点是否在队列中
bool SPFA(int s){
//初始化部分
memset(inq, false, sizeof(inq));
memset(num, 0, sizeof(num));
fill(d, d + MAXV, INF);
//源点入队部分
queue<int> Q;
Q.push(s); //源点入队
inq[s] = true; //源点已入队
num[s]++; //源点入队次数加1
d[s] = 0; //源点的d值为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 dis = Adj[u][j].dis;
//松弛操作
if(d[u] + dis < d[v]){
d[v] = d[u] + dis;
if(!inq[v]){ //如果v不在队列中
Q.push(v); //v入队
inq[v] = true; //设置v为在队列中
num[v]++; //v的入队次数加1
if(num[v] >= n) return flase; //有可达负环
}
}
}
}
return true; //无可达负环
}
int main(){
return 0;
}
SPFA算法 判断可达负环
最新推荐文章于 2022-02-10 01:03:26 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)