spfa算法判断负环存在原理:维护cnt数组,储存初始节点到达该节点的边数,当到达某个点的边数>=n,即证明存在负环,因为最多只有n个点,最多只需要n-1条边,所以边数>=n就可以证明负环存在
注意点:
①邻接表的初始化
②当到达某个点的边数>=n,即证明存在负环,因为最多只有n个点,最多只需要n-1条边,所以边数>=n就可以证明负环存在,所以应该是cnt[i] >= n 而不是边数cnt[i]>=边数m
③点入队需要改对应的st值
代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int N = 1e4 + 10;
int e[N], ne[N], h[N], w[N], idx;//邻接表
int dis[N], cnt[N];//距离、边数
int n, m;
bo