会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;
}