题目
细节
判负环时不要用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;
}