#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct path{
int y,w,next;
}a[10010];
int j=1,elast[2010];
void add(int x,int y,int w)
{
a[j].y=y;
a[j].w=w;
a[j].next=elast[x];
elast[x]=j++;
}
queue<int>u;
int n,m,x,y,w,sum[2010];
ll dis[2010];
bool vis[2010];
bool SPFA(int s)
{
dis[s]=0;
u.push(s);
for(;u.size();)
{
x=u.front(),u.pop();
vis[x]=false;
for(int i=elast[x];i;i=a[i].next)
{
y=a[i].y,w=a[i].w;
if(dis[x]+w<dis[y])
{
sum[y]=sum[x]+1;
if(sum[y]==n)
{
printf("Yes");
return true;
}
dis[y]=dis[x]+w;
if(!vis[y])
{
vis[y]=true;
u.push(y);
}
}
}
}return false;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)dis[i]=1e18;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&w);
add(x,y,w);
}
for(int i=1;i<=n;i++)if(dis[i]==1e18&&SPFA(i))return 0;
printf("No");
return 0;
}
本题解两大要点
1、入队次数超过n,根据抽屉原理所以重复,判负回
2、距离还是初始值,说明这个点没有算入反复路径中(前面没有被遍历过),所以用SPFA判定