为什么我这样写只有20,加了一句vis[now]=false就A了
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define li(i,j,k) for(int i=j ; i<=k ; i++)
#define si(i,j,k) for(int i=j ; i>=k ; i--)
const int INF=2147483647;
const int MAX_N=40001;
const int MAX_M=40001;
int cnt[MAX_N];//表示从点1开始到i点需要经过多少点
int dis[MAX_N];
int head[MAX_M],tot;
bool vis[MAX_N];
int n,m;
struct yzy{
int to,val;
int next;
}Edge[MAX_M<<1];
priority_queue<int,vector <int> ,greater <int> >q;
void add(int u,int v,int w){
tot++;
Edge[tot].val=w;
Edge[tot].to=v;
Edge[tot].next=head[u];//下一条边,不是边指向的点
head[u]=tot;//更新这个点所指的边
return ;
}
bool SPFA(int s){
fill(dis+1,dis+n+1,INF);//初始化
memset(cnt,0,sizeof(cnt));
memset(vis,false,sizeof(vis));
cnt[s]=1;
dis[s]=0;
vis[s]=true;
q.push(s);
while(!q.empty()){
int now=q.top();
q.pop();
//vis[now]=false;
for (int i=head[now] ; i!=-1 ; i=Edge[i].next){//i指的是边
int to=Edge[i].to;
if(dis[to]>dis[now]+Edge[i].val){//
dis[to]=dis[now]+Edge[i].val;
cnt[to]=cnt[now]+1;
if(cnt[to]>=m)//有负环
return 1;
if(!vis[to]){
q.push(to);
vis[to]=true;
}
}
}
}
return 0;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
while(!q.empty())q.pop();//清空
memset(head,-1,sizeof(head));
memset(Edge,0,sizeof(Edge));
tot=-1;
li(i,1,m){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
if(w>=0)add(u,v,w),add(v,u,w);
else add(u,v,w);
}
if(SPFA(1))printf("YES\n");
else printf("NO\n");
}
return 0;
}