以下是我的代码(我不相信我的快读有问题):
#include<bits/stdc++.h>
#define LL long long
#define pii pair<int,int>
using namespace std;
inline void read(int &x){
x=0;
bool f=0;
char c;
while(((c=getchar())<'0'||c>'9')&&c!='-');
if(c=='-') f=1;
else x=c^48;
while((c=getchar())>47&&c<58) x=(x<<3)+(x<<1)+(c^48);
if(f) x=~x+1;
}
const int N=3e4+10;
struct node{int v,w,next;}e[N];
int n,m,cnt,h[N],d[N],ans[N];
bool vis[N];
inline void add(int u,int v,int w){
e[++cnt]={v,w,h[u]};
h[u]=cnt;
}
queue<int> q;
inline bool spaf(){
memset(d,0x3f,sizeof d);
memset(vis,0,sizeof vis);
memset(ans,0,sizeof ans);
while(!q.empty()) q.pop();
d[1]=0,vis[1]=1,q.push(1);
while(!q.empty()){
int t=q.front();
q.pop();
vis[t]=0;
for(int j=h[t];j;j=e[j].next){
int v=e[j].v;
if(d[v]>d[t]+e[j].w){
d[v]=d[t]+e[j].w;
ans[v]=ans[t]+1;
if(ans[v]>=n) return 1;
if(!vis[v]) vis[v]=1,q.push(v);
}
}
}
return 0;
}
int main(){
int t;
read(t);
while(t--){
memset(h,0,sizeof 0);
cnt=0;
read(n),read(m);
for(int i=1,a,b,c;i<=m;i++){
read(a),read(b),read(c);
add(a,b,c);
if(c>=0) add(b,a,c);
}
if(spaf()) puts("YES");
else puts("NO");
}
return 0;
}