spfa求负环
传送门:P3305[模板]负环
负环的定义
负环的定义是:一条边权之和为负数的回路。
找负环的方法
一个含有负环的图是一定没有最短路的,因为一旦有负环则在求最短路的时候会陷在负环中而无法自拔。
所以,若图中没有负环,则最多经过n-1轮迭代后算法结束。若第n轮迭代仍有结点的最短路能被更新,则图中有负环。
所以我们用 cnt[x] 表示1到x的最短路包含的边数(该题要求以1作为源点),cnt[1]=0。每次用 dis[x]+w(x,y) 更新dis[y]时,也是cnt[x]+1更新 cnt[y]。此过程中若出现cnt[y]≥n,则图中有负环。最坏情况复杂度也是 O(nm)。
代码实现
#include<bits/stdc++.h>
#define in read()
#define MAXN 3003
#define MAXM 2*MAXN
using namespace std;
int T,n,m;
int nex[MAXM],first[MAXM],to[MAXM],val[MAXM],tot=0;
bool vis[MAXN];
int cnt[MAXN],dis[MAXN];
queue<int>q;
inline int read(){
int x=0,f=1;char c=