[洛谷 3385]【模板】负环

题目链接

https://www.luogu.org/problemnew/show/P3385

题解

一道SPFA的模板题,但是数据很坑(chen_zhe真是毒瘤)

这里有几点注意事项:

1、输出不是“YES”or“NO”(幸好我眼尖)

2、最好在函数前加个inline(防止被卡常数)

3、bfs其实效率不如dfs

4、不要用STL,调试麻烦,还会TLE(除非你想开O2)

这里补一张我BFS的提交记录(压线的AC):


#include <stdio.h>
#include <string.h>
#define INF 0x3f
struct edge
{
 int t,w,next;
}e[400005];
int head[20005],q[4000005],d[20005],vis[20005],vt[20005],cnt;
int n,m;
inline void insert(int s,int t,int w)//这里不用inline会TLE,毕竟常数太大 
{
 e[++cnt].t=t;
 e[cnt].w=w;
 e[cnt].next=head[s];
 head[s]=cnt;
}
inline bool spfa()//模板
{
 int l=0,r=1;
 d[1]=0;
 q[r]=1;
 while(l<r)
 {
  int h=q[++l];
  vis[h]=0;
  for(int i=head[h];~i;i=e[i].next)
  {
   if(d[h]+e[i].w<d[e[i].t])
   {
   	vt[e[i].t]++;
   	if(vt[e[i].t]>=n)return 1;
   	d[e[i].t]=d[h]+e[i].w;
   	if(!vis[e[i].t])
   	{
   	 q[++r]=e[i].t;
   	 vis[e[i].t]=1;
	}
   }
  }
 }
 return 0;
}
inline void init()
{
 cnt=0;
 memset(q,0,sizeof(q));
 memset(e,0,sizeof(e));
 memset(head,-1,sizeof(head));
 memset(vis,0,sizeof(vis));
 vis[1]=1;
 memset(d,INF,sizeof(d));
 memset(vt,0,sizeof(vt));
}
int main()
{
 int t;
 scanf("%d",&t);
 while(t--)
 {
  init();
  scanf("%d%d",&n,&m);
  for(int i=1;i<=m;i++)
  {
   int a,b,w;
   scanf("%d%d%d",&a,&b,&w);
   insert(a,b,w);
   if(w>=0)insert(b,a,w);
  }
  if(spfa())puts("YE5");//坑人的输出 
  else puts("N0");
 }
 return 0;
}


猜你喜欢

转载自blog.csdn.net/studyingfather/article/details/80373195