社区讨论

那位dalao能个帮我看一下哪里有问题,一直死循环

P3385【模板】负环参与者 2已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@ly3rag8p
此快照首次捕获于
2024/07/02 09:54
2 年前
此快照最后确认于
2024/07/02 13:00
2 年前
查看原帖
CPP
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
const int N=1e5+10;
int n,m,t,w[N],e[N],ne[N],h[N],idx,dist[N],vis[N],cnt[N],u,v,x;
void add(int a,int b,int c){
	e[idx]=b;
	w[idx]=c;
	ne[idx]=h[a];
	h[a]=idx++;
}
bool spfa(){
	memset(dist,0x3f,sizeof dist);
	memset(vis,0,sizeof vis);
	memset(cnt,0,sizeof cnt);
	
	queue<int>q;
	for(int i=1;i<=n;++i){
		q.push(i);
		vis[i]=1;
	}
	while(!q.empty()){
		int k=q.front();
		q.pop();
		vis[k]=0;
		for(int i=h[k];i!=-1;i=ne[i]){
			int j=e[i];
			if(dist[j]>dist[k]+w[i]){
				dist[j]=dist[k]+w[i];
				cnt[j]=cnt[k]+1;
				if(cnt[j]>=n){
					return true;
				}
				if(!vis[j]){
					q.push(j);
					vis[j]=1;
				}
			}
		}
	}
	return false;
}
int main() {
	memset(e,-1,sizeof e);
	cin>>t;
	while(t--){
		memset(e,-1,sizeof e);
		cin>>n>>m;
		for(int i=1;i<=m;++i){
			int a,b,c;
			cin>>u>>v>>x;
			if(c>=0){
				add(u,v,x);
				add(v,u,x);
			}else{
				add(u,v,x);
			}
		}
		if(spfa()) cout<<"YES";
		else cout<<"NO";
	}
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...