专栏文章

SPFA判断负环

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mipmhvvj
此快照首次捕获于
2025/12/03 14:25
3 个月前
此快照最后确认于
2025/12/03 14:25
3 个月前
查看原文
C
#include <bits/stdc++.h>
using namespace std;
const int N=2e4+5,inf=1e9;
int t,n,m,dis[N],cnt[N];
bool vis[N];
struct node{
	int v,w;
};
vector<node> g[N];
bool spfa(){
	queue<int> q;
	memset(vis,0,sizeof(vis));
	vis[1]=1;
	cnt[1]=0;
	q.push(1);
	while(!q.empty()){
		int u=q.front();
		q.pop();
		vis[u]=0;
		for(auto e:g[u]){
			int v=e.v,w=e.w;
			if(dis[u]+w<dis[v]){
				dis[v]=dis[u]+w;
				cnt[v]=cnt[u]+1;
				if(cnt[v]>=n){
					return true;//存在负环
				}
				if(!vis[v]){
					vis[v]=1;
					q.push(v);
				}
			}
		}
	}
	return false;//不存在负环
}
int main(){
	cin>>t;
	while(t--){
		cin>>n>>m;
		dis[1]=0;
		fill(dis+2,dis+n+1,inf);
		for(int i=1;i<=n;i++){
			g[i].clear();
		}
		for (int i=1;i<=m;i++){
			int u,v,w;
			cin>>u>>v>>w;
			g[u].push_back({v,w});
			if(w>=0){
				g[v].push_back({u,w});
			}
		}
		bool flag=spfa();
		if(flag){
			cout<<"YES"<<endl;
		}
		else{
			cout<<"NO"<<endl;
		}
	}
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...