P3385 【模板】负环(SPFA)
题目链接:https://www.luogu.com.cn/problem/P3385
题解
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long ll;
int t,n;
int m;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>t;
while(t--)
{
cin>>n>>m;
vector<vector<pair<int,int>>>graph(n+1);
vector<int>dis(n+1,INT_MAX);
vector<bool>enter(n+1,false);
queue<int>que;
vector<int>update(n+1,0);
for(int i=0;i<m;i++)
{
int u,v,w;
cin>>u>>v>>w;
if(w>=0)
{
graph[u].push_back({v,w});
graph[v].push_back({u,w});
}
else
{
graph[u].push_back({v,w});
}
}
dis[1]=0;
que.push(1);
enter[1]=true;
update[1]=1;
int cmd=0;
while(!que.empty())
{
int x = que.front();
enter[x]=false;
que.pop();
for(auto edge:graph[x])
{
int to = edge.first;
int ww = edge.second;
if(dis[to]>dis[x]+ww)
{
dis[to]=dis[x]+ww;
if(!enter[to])
{
update[to]++;
que.push(to);
enter[to]=true;
}
}
if(update[to]>=n)
{
cmd=1;
break;
}
}
if(cmd==1)break;
}
if(cmd==1)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}

浙公网安备 33010602011771号