n个点,从起点到终点最多n-1条边,即从起点到终点最多n-1条路,所以当某个点进队次数大于n时一定存在负权回路
i进队一次表示表示从起点到i增加一条新路
#include<bits/stdc++.h>
using namespace std;
int n,m,h[100010],vis[100010],dis[100010],cnt=0,t[10010];
vector <int>v[100010];
struct node
{
int from,to,w,next;
}eg[100010];
void add(int u,int v,int w)
{
eg[cnt].to=v;
eg[cnt].w=w;
eg[cnt].next=h[u];
h[u]=cnt++;
}
int spfa()
{
queue<int>q;
memset(dis,0x3f3f3f3f,sizeof(dis));
dis[1]=0;
vis[1]=1;
q.push(1);
while(!q.empty())
{
int now=q.front();
q.pop();
vis[now]=0;
for(int i=h[now];i!=-1;i=eg[i].next)
{
if(dis[eg[i].to]>(dis[now]+eg[i].w))
{
dis[eg[i].to]=(dis[now]+eg[i].w);
if(!vis[eg[i].to])
{
q.push(eg[i].to);
vis[eg[i].to]=1;
t[eg[i].to]++;
if(t[eg[i].to]>n)
return 0;
}
}
}
}
return 1;
}
int main()
{
memset(h,-1,sizeof(h));
scanf("%d%d",&n,&m);
while(m--)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
if(spfa())
{
printf("无负权回路\n");
}
else
printf("有负权回路\n");
return 0;
}