#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int N=100010;
int h[N],e[N],w[N],ne[N],idx;
bool st[N];
int dist[N],cnt[N],n,m;
void add(int a, int b, int c) // 添加一条边a->b,边权为c
{
e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
}
bool spfa()
{
queue<int> path;
for(int i=1;i<=n;i++)
{
if(h[i]!=-1){
path.push(i);
st[i]=true;
}
}
while(path.size())
{
int t=path.front();
path.pop();
st[t]=false;
for(int i=h[t];i!=-1;i=ne[i])
{
int tm=e[i];
if(dist[tm]>dist[t]+w[i])
{
dist[tm]=dist[t]+w[i];
cnt[tm]=cnt[t]+1;
if(cnt[tm]>=n)return true;
if(!st[tm])
{
path.push(tm);
st[tm]=true;
}
}
}
}
return false;
}
int main()
{
memset(h,-1,sizeof h);
memset(dist,0x3f3f3f3f,sizeof dist);
cin>>n>>m;
while (m -- ){
int x,y,z;
cin>>x>>y>>z;
add(x,y,z);
}
if(spfa())cout<<"Yes";
else cout<<"No";
}
spfa判断是否存在负环
最新推荐文章于 2024-07-22 10:02:43 发布