最短路模板负环

题目

P3385 【模板】负环

细节

判负环时不要用deque,否则会wa一个点

WA掉的数据

洛谷数据#9
正确输出:NO

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e6+10,maxm=1e6+10;
int head[maxn],ver[maxm],edge[maxm],Next[maxm],tot;
void add(int x,int y,int z){
	ver[++tot]=y,edge[tot]=z,Next[tot]=head[x],head[x]=tot;
}
int t,n,m;
queue<int>q;
int vis[maxn],dis[maxn],cnt[maxn];
bool spfa(int s){
	memset(cnt,0,sizeof(cnt));
	memset(dis,0x3f,sizeof(dis));
	memset(vis,0,sizeof(vis));
	q.push(s);
	vis[s]=1,dis[s]=0;
	cnt[s]++;
	while(!q.empty()){
		int u=q.front();q.pop();
		vis[u]=0;
		for(int i=head[u];i;i=Next[i]){
			int v=ver[i];
			if(dis[v]>dis[u]+edge[i]){
				dis[v]=dis[u]+edge[i];
				if(!vis[v]){
					cnt[v]++;
					if(cnt[v]>n+1){
						return 1;
					}
					vis[v]=1;
					q.push(v);
				}
			}
		}
		
	}
	return 0;
} 
void Init(){
	tot=0;
	memset(head,0,sizeof(head));
	memset(ver,0,sizeof(ver));
	memset(Next,0,sizeof(Next));
	memset(edge,0,sizeof(edge));
}
int main(){
	freopen("P3385_9.in","r",stdin);
	scanf("%d",&t);
	while(t--){
		Init();
		scanf("%d%d",&n,&m);
		int x,y,z;
		bool flag=0;
		for(int i=1;i<=m;i++){
			scanf("%d%d%d",&x,&y,&z);
			if(z>=0)add(x,y,z),add(y,x,z);
			else{
				add(x,y,z);
				flag=1;	
			}
		}
		if(flag==0||!spfa(1)){
			printf("NO
");
		}else printf("YES
");
	}
	return 0;
}
原文地址:https://www.cnblogs.com/soda-ma/p/13280878.html