【模板】负环

描述

找负环

输入

第一行一个正整数T表示数据组数,对于每组数据:
第一行两个正整数N M,表示图有N个顶点,M条边
接下来M行,每行三个整数a b w,表示a->b有一条权值为w的边(若w<0则为单向,否则双向)

输出

共T行。对于每组数据,存在负环则输出一行"YE5"(不含引号),否则输出一行"N0"(不含引号)。

样例

输入
2
3 4
1 2 2
1 3 4
2 3 1
3 1 -3
3 3
1 2 3
2 3 4
3 1 -8
输出
N0
YE5

提示

N,M,|w|≤200 000;1≤a,b≤N;T≤10 建议复制输出格式中的字符串。
此题普通Bellman-Ford或BFS-SPFA会TLE


此题普通Bellman-Ford或BFS-SPFA真的会TLE!证明: https://www.luogu.org/record/show?rid=3554669

判断负环最常用的就是spfa。当然各位大佬搜索暴力也能过的……
而判负环的spfa也有2种,一种是BFS,而另一种是DFS怎么都是大法师

BFS

BFS的尤其简单
在普通的spfa上加一个数组,记录各个点被更新/入栈的次数,一旦大于了某个数(一般取点数)就判定是有负环的。
BFS_SPFA的期望时间复杂度是\(O(\)边数\(*\)所有顶点进队的平均次数\()\),
既然存在负环,这个期望的时间复杂度就真的是期望了,鬼知道这负环有多长,还要绕多少圈,慢的一比。

DFS

而DFS的要改一改
找负环,就是找一条权值和为负的回路,
而在我们的DFS过程中,根据SPFA,我们找到的负环一定包含当前枚举的这个点。
即相当于我们找了一圈回来,发现现在的权值比原来的要小,那么我们就一定走了一个负环。
那么我们就分别枚举所有的点作为起点找负环,为了不TLE,如果已经找到一个负环就不再继续枚举。
代码蒯上

#include<iostream>
#include<iomanip>
#include<cmath>
#include<queue>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
inline int gotcha()
{register int _a=0;bool _b=1;register char _c=getchar();while(_c<'0' || _c>'9'){if(_c=='-')_b=0;_c=getchar();}while(_c>='0' && _c<='9')_a=_a*10+_c-48,_c=getchar();return _b?_a:-_a;
}
const int _ = 200002;
struct edge{int to,ne,len;edge(){to=ne=len=0;}}e[_<<1];
int he[_]={0},ecnt=0;
void add(int fr,int to,int len)
{e[++ecnt].to=to,e[ecnt].len=len,e[ecnt].ne=he[fr],he[fr]=ecnt;}
int n,m,dis[_];
bool ed[_]={0},vict;
void spfa(int d)
{register int i,b;if(vict)return;ed[d]=1;for(i=he[d];i;i=e[i].ne){b=e[i].to;if(dis[d]+e[i].len<dis[b]){dis[b]=dis[d]+e[i].len;if(ed[b]){vict=1;return;}spfa(b);}}ed[d]=0;return;
}
int main()
{register int i,k,a,b,t=gotcha();while(t--){n=gotcha(),m=gotcha();memset(he,0,4*n+8),memset(ed,0,n+2),memset(dis,63,4*n+8),ecnt=0,vict=0;for(i=1;i<=m;i++){a=gotcha(),b=gotcha(),k=gotcha();add(a,b,k);if(k>=0)add(b,a,k);}for(i=1;i<=n;i++){spfa(i);if(vict)break;}if(vict)puts("YE5");else puts("N0");}return 0;
}

转载于:https://www.cnblogs.com/finder-iot/p/7623908.html

SPFA - Luogu 3385 【模板】负环相关推荐

  1. 用SPFA判断是否存在负环

    题目描述 暴力枚举/SPFA/Bellman-ford/奇怪的贪心/超神搜索 输入输出格式 输入格式: 第一行一个正整数T表示数据组数,对于每组数据: 第一行两个正整数N M,表示图有N个顶点,M条边 ...

  2. 【最短路径问题笔记】SPFA算法及负环的判断

    dis数组:记录源点到每个结点最短路径值 in数组:记录结点进队次数 vis数组:记录结点是否在队列中 设立队列用来保存待优化的结点: 优化时每次取出队首结点cur,并且用cur点当前的最短路径对u点 ...

  3. AcWing 904. 虫洞(SPFA or Djakarta or bellman判负环)

    题目连接 http://poj.org/problem?id=3259 思路 大概是想问我们能不能找到一个负环,那么再看一眼数据范围,500,感觉乱搞都能过,但是出题人很恶心啊,n的范围并不是500, ...

  4. 糖果(SPFA、判负环)

    Description 幼儿园里有 N 个小朋友,老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是 ...

  5. 解题报告:luoguP2868 Sightseeing Cows G(最优比率环,负环判定,二分答案)

    根据题意,我们要环上各点权值之和除以各边权值之和最大. 求最大答案,很明显可以使用二分答案.那么我们假设当前答案为 x,如果有更大的答案,那么方程就可以按下图转换: 也就是说如果有更大的答案,则有一个 ...

  6. Luogu P3385 【模板】负环 - 题解

    [模板]负环 题目描述 给定一个 nnn 个点的有向图,请求出图中是否存在从顶点 111 出发能到达的负环. 负环的定义是:一条边权之和为负数的回路. 输入格式 本题单测试点有多组测试数据. 输入的第 ...

  7. POJ 3259 Wormholes【最短路/SPFA判断负环模板】

    农夫约翰在探索他的许多农场,发现了一些惊人的虫洞.虫洞是很奇特的,因为它是一个单向通道,可让你进入虫洞的前达到目的地!他的N(1≤N≤500)个农场被编号为1..N,之间有M(1≤M≤2500)条路径 ...

  8. 模板 - 判断负环(超时高效优化技巧)、01分数规划

    整理的算法模板合集: ACM模板 判断负环 判正环求最长路,判负环求最短路 int n; // 总点数 int h[N], w[N], e[N], ne[N], idx; // 邻接表存储所有边 in ...

  9. 算法提高课-图论-负环-AcWing 361. 观光奶牛:spfa判正环、负环、01分数规划、二分

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 题目要求ΣfiΣgi\frac{\Sigma{f_i}}{\Sigma{g_i}}Σgi​Σfi​​的最大值,这种问题称为01分数规 ...

  10. P3385 【模板】负环

    https://www.luogu.com.cn/problem/P3385 这个和普通的判负环有点区别.普通的判负环是判断有没有负环即可. 这个的判负环是从1出发的负环. 故得将距离初始化为无穷,然 ...

最新文章

  1. 机器学习四剑客3——Pandas
  2. python会调用linuxapi吗_RouterOS之python调用API
  3. 趣图:好好干,今天再加个班
  4. golang中map并发读写问题及解决方法
  5. android开发环境 国内镜像 及Android SDK manager使用国内服务器方法
  6. onkeyup,onkeydown和onkeypress
  7. Dubbo支持的注册中心
  8. aptana studio 3支持jquery
  9. @builder注解_SpringBoot 整合SpringSecurity示例实现前后分离权限注解+JWT登录认证
  10. 汽车电子专业知识篇(三十二)-整车电控系统及架构设计技术
  11. mysql declare 赋值_sql server和mysql变量赋值的区别 以及 MySql Declare
  12. jQuery基础 - 改变CSS样式
  13. 'mysql' 不是内部或外部命令,也不是可运行的程序或批处理文件的解决办法
  14. linux解决Tomcat内存溢出
  15. 互联网系统故障应急处理流程
  16. linux上电自动开启wifi脚本,archlinux 开机自动连接wifi
  17. 恺撒密码的python实现介绍
  18. 怎么用万用表检测场效应管的好坏?
  19. MATLAB解线性方程组
  20. Ubuntu14.04下安装vim显示没有可用的软件包vim-gtk

热门文章

  1. 到底是大数据还是“拍脑门”?
  2. VS2010+OpenCV2.4.9配置
  3. 兴业银行实时跨行转入功能、免除手续费及网点排队
  4. 体验下Xcode5与ios7
  5. 现实世界的Windows Azure: 采访LexisNexis的Marc Slovak 和 Manish Bhargava
  6. 敏捷 - #7 原则:工作软件是进度的主要衡量标准 ( #7 Agile - Principle)
  7. 【爬坑日记】vue中传props时默认为Boolean问题
  8. 2017上半年软考 第十二章 重要知识点
  9. spring4声明式事务mdash;02 xml配置方式
  10. 【转】visio画UML用例图没有include关系的解决方法