求大佬帮忙解释!!!
查看原帖
求大佬帮忙解释!!!
1060212
Saturation楼主2024/8/6 12:19

会WA一个点,spfa里的cnt[y]>n改成cnt[y]>n+10就过了是为什么啊?

#include<bits/stdc++.h>
using namespace std;
const int N=21000;
int T,n,m;
int e[2*N],h[N],ne[2*N],w[2*N],idx;
bool st[2*N];
int cnt[2*N];
int dist[2*N];
void add(int x,int y,int z) {
	e[++idx]=y;
	w[idx]=z;
	ne[idx]=h[x];
	h[x]=idx;
}
int in() {
	int ans=0,ff=1;
	int c=getchar();
	for(; !isdigit(c); c=getchar()) {
		if(c=='-') {
			ff=-1;
		}
	}
	for(; isdigit(c); c=getchar()) {
		ans=ans*10+c-'0';
	}
	return ans*ff;
}
void out(int x) {
	if(x<0) {
		putchar('-');
		x=-x;
	}
	if(x>=10) {
		out(x/10);
	}
	putchar(x%10+'0');
}
bool spfa() {
	queue<int>q;
	q.push(1);
	st[1]=1;
	cnt[1]=1;
	dist[1]=0;
	while(q.size()) {
		int x=q.front();
		q.pop();
		st[x]=0;
		for(int i=h[x]; ~i; i=ne[i]) {
			int y=e[i],z=w[i];
			if(dist[y]>dist[x]+z) {
				dist[y]=dist[x]+z;
				cnt[y]++;
				if(cnt[y]>n) {
					return true;
				}
				if(!st[y]) {
					st[y]=1;
					q.push(y);
				}
			}
		}
	}
	return false;
}
int main() {
	T=in();
	while(T--) {
		n=in();
		m=in();
		memset(h,-1,sizeof h);
		memset(ne,0,sizeof ne);
		memset(w,0,sizeof w);
		memset(e,0,sizeof e);
		memset(cnt,0,sizeof cnt);
		memset(st,0,sizeof st);
		memset(dist,0x3f,sizeof dist);
		for(int i=1; i<=m; i++) {
			int x=0,y=0,z=0;
			x=in();
			y=in();
			z=in();
			if(z>=0) {
				add(y,x,z);
			}
			add(x,y,z);
		}
		if(spfa()) {
			puts("YES");
		} else {
			puts("NO");
		}
	}
	return 0;
}


2024/8/6 12:19
加载中...