根据SPFA模板改,不知道哪里有问题 题目
#include<bits/stdc++.h>
using namespace std;
const int N=4e3+10,INF=1e9;
int T,n;
int ne[N],to[N],head[N],w[N],idx;
int dist[N],cnt[N];
bool vis[N];
void add(int a,int b,int c)
{
ne[idx]=head[a];
to[idx]=b;
w[idx]=c;
head[a]=++idx;
}
bool spfa()
{
memset(vis,0,sizeof vis);
memset(cnt,0,sizeof cnt);
for(int i=1;i<=n;i++) dist[i]=INF;
dist[1]=0;
queue<int> q;
q.push(1);
vis[1]=1;
while(!q.empty())
{
int fron=q.front();
q.pop();
vis[fron]=0;
for(int i=head[fron];i!=-1;i=ne[i])
{
int rea=to[i];
if(dist[rea]>dist[fron]+w[i])
{
dist[rea]=dist[fron]+w[i];
if(!vis[rea])
{
cnt[rea]=cnt[fron]+1;
if(cnt[rea]>=n) return true;
q.push(rea);
vis[rea]=true;
}
}
}
}
return false;
}
int main()
{
cin>>T;
while(T--)
{
memset(head,-1,sizeof head);
memset(w,0,sizeof w);
int n,m;cin>>n>>m;
for(int i=1;i<=m;i++)
{
int a,b,c;cin>>a>>b>>c;
add(a,b,c);
if(c>=0)
add(b,a,c);
}
if(spfa()) cout<<"Yes\n";
else cout<<"No\n";
}
}