判断负环(spfa)

Posted SSL_LKJ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了判断负环(spfa)相关的知识,希望对你有一定的参考价值。

判断负环

在这里插入图片描述
在这里插入图片描述

解题思路

spfa判断负环

AC代码

#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
int T,n,m,tot,d[2005],c[2005],v[2005],f[10005],hd[2005];
queue <int> q;
struct node
{
	int to,next,w;
}a[6005];
void add(int x,int y,int z)
{
	a[++tot]=(node){y,hd[x],z};
	hd[x]=tot;
}
int spfa()//判断负环
{
	d[1]=0,
	v[1]=c[1]=1;
	q.push(1);	
	while(!q.empty())
	{
		int x1=q.front();
		q.pop();
		for(int i=hd[x1];i;i=a[i].next)
		 if(d[a[i].to]>d[x1]+a[i].w)
		  {
			d[a[i].to]=d[x1]+a[i].w;
			if(!v[a[i].to])
			{
				v[a[i].to]=1;
				q.push(a[i].to);
				c[a[i].to]++;
				if(c[a[i].to]>=n-1)return 1;
			}
		 }
		v[x1]=0;
	} 
	return 0;
}
int main()
{
	scanf("%d",&T);
	while(T--)
	{
		memset(c,0,sizeof(c));//清零
		memset(v,0,sizeof(v));
		memset(hd,0,sizeof(hd));
		memset(d,0x7f,sizeof(d));
		tot=0;
		scanf("%d%d",&n,&m);
		for(int i=1;i<=m;i++)
		{
			int u,v,w;
			scanf("%d%d%d",&u,&v,&w);
			add(u,v,w);
			if(w>=0)add(v,u,w);
		}
		if(spfa())printf("YE5\\n");
		else printf("N0\\n");
	}
	return 0;
}

谢谢

以上是关于判断负环(spfa)的主要内容,如果未能解决你的问题,请参考以下文章

SPFA判负环|BFS|DFS

SPFA算法以及负环判断模板

SPFA算法以及负环判断模板

spfa负环判断

[luoguP1993] 小 K 的农场(差分约束 + spfa 判断负环)

AcWing 852. spfa判断负环(spfa or bellman)