spfa算法求负环

本文详细介绍了SPFA算法如何寻找图中的负环。负环定义为边权之和为负的回路。当存在负环时,算法会陷入无限循环,无法找到最短路径。通过记录节点最短路径包含的边数cnt[x],若cnt[y]超过n,表明存在负环。提供的代码实现展示了如何利用SPFA在最坏情况下以O(nm)复杂度检测负环。
摘要由CSDN通过智能技术生成

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=
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值