如果是前向星的话,得把head也清零!!
#include<bits/stdc++.h>//血的教训,调一个晚上,vector和队列都得清零!!!
#define maxn 100500
using namespace std;
struct edge
{
int v,w;
};
vector<edge> e[maxn];
int n,m,dis[maxn],vis[maxn],cnt[maxn];
queue<int> q;
bool spfa(int s)
{
for(int i = 1;i <= n ;i++)
{
dis[i] = INT_MAX,vis[i] = 0,cnt[i] = 0;
}
dis[s] = 0;
vis[s] = 1;
cnt[s] = 1;
q.push(s);
while(!q.empty())
{
int u = q.front();
q.pop();
vis[u] = 0;
for(int j = 0 ;j < e[u].size();j++)
{
edge ed = e[u][j];
int v=ed.v,w=ed.w;
if(dis[v] > dis[u] + w)
{
dis[v] = dis[u] + w;
if(!vis[v])
{
cnt[v]++;
vis[v] = 1;
q.push(v);
if(cnt[v] > n)
{
cout<<"YES"<<endl;
return true;
}
}
}
}
}
cout<<"NO"<<endl;
return false;
}
int main()
{
std::ios::sync_with_stdio(false);
int T;
cin>>T;
while(T--)
{
cin>>n>>m;
for(int i = 1;i <= m;i++)
{
int u;
edge l;
cin>>u>>l.v>>l.w;
e[u].push_back(l);
int a=l.v,b=l.w;
if(b>=0)
{
e[a].push_back({u,b});
}
}
spfa(1);
for(int j = 1;j <=n ;j++) e[j].clear();//血的教训,调一个晚上,vector和队列都得清零!!!
while(!q.empty()) q.pop();//
}
return 0;
}