判断负环(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)的主要内容,如果未能解决你的问题,请参考以下文章