思路:
直接暴力跑spfa,如果一个点被走过太多次,那么就有负环
c o d e code code
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
long long n, m, tot;
long long head[50010], dis[50010], d[50010];
bool v[50010];
queue<int> q;
struct node
{
long long to, next, w;
}b[50010];
void add(long long x, long long y, long long w)
{
b[++tot]=(node){y, head[x], w};
head[x]=tot;
}
bool spfa(long long x)
{
memset(v, 0, sizeof(v));
// while(!q.empty())
// q.pop();//出栈就错了?
for(long long i=1; i<=n; i++)
dis[i]=1e18;
dis[x]=0;
v[x]=1;
q.push(x);
while(!q.empty())
{
long long x1=q.front();
q.pop();
v[x1]=0;
for(long long i=head[x1]; i; i=b[i].next)
{
long long y=b[i].to;
if(dis[y]>dis[x1]+b[i].w)
{
dis[y]=dis[x1]+b[i].w;
d[y]=d[x1]+1;
if(d[y]>=m)
return 0;
if(v[y]==0)
{
v[y]=1;
q.push(y);
}
}
}
}
return 1;
}
int main()
{
long long t;
scanf("%lld", &t);
while(t--)
{
scanf("%lld%lld", &n, &m);
for(long long i=1; i<=m; i++)
{
long long x, y, w;
scanf("%lld%lld%lld", &x, &y, &w);
if(w>=0)
add(x, y, w), add(y, x, w);
else
add(x, y, w);
}
if(spfa(1))
printf("N0\n");
else
printf("YE5\n");
tot=0;
memset(head, 0, sizeof(head));
memset(d, 0, sizeof(d));
}
return 0;
}