RT,数据范围m<=3000,但蒟蒻不开60000+就RE,开了就AC,好奇原因
#include<bits/stdc++.h>
using namespace std;
const int MAXM=60003;
const int MAXN=20003;
const int MAX=10004;
int t,n,m,cnt;
inline int read() {
int X=0,w=1; char c=getchar();
while (c<'0'||c>'9') { if (c=='-') w=-1; c=getchar(); }
while (c>='0'&&c<='9') X=(X<<3)+(X<<1)+c-'0',c=getchar();
return X*w;
}
int head[MAXN],dis[MAXN],tot[MAXN];
bool vis[MAXN];
struct Node{
int to,w,nxt;
}edge[MAXM];
inline void addedge(int x,int y,int z){
edge[++cnt].to=y;
edge[cnt].w=z;
edge[cnt].nxt=head[x];
head[x]=cnt;
}
queue <int> q;
bool dij(){
memset(dis,0x3f,sizeof(dis));
dis[1]=0;
memset(vis,0,sizeof(vis));
memset(head,0,sizeof(head));
memset(tot,0,sizeof(tot));
n=read(),m=read();
int u,v,w;
for(int i=1;i<=m;i++){
u=read(),v=read(),w=read();
addedge(u,v,w);
if(w>=0)addedge(v,u,w);
}
q.push(1);
vis[1]=1;
while(!q.empty()){
int x=q.front(),v;
q.pop();
vis[x]=0;
for(int i=head[x];i;i=edge[i].nxt){
int v=edge[i].to;
if(dis[v]>dis[x]+edge[i].w){
dis[v]=dis[x]+edge[i].w;
tot[v]=tot[x]+1;
if(tot[v]>n)return 1;
if(!vis[v]){
q.push(v);
vis[v]=1;
}
}
}
}
return 0;
}
int main(){
t=read();
while(t--){
printf(dij()?"YES\n":"NO\n");
}
return 0;
}