洛谷题目传送门

HNOI爆零前回刷模板题

非常不正经的题目,目前并没有合适的优秀算法,就算是大家公认的dfs(还是不要强行叫dfs-spfa吧,概念应该不一样,这就是暴力dfs松弛答案)

但是对于随机数据来说,dfs有着优秀的效率,可以快速发现负环并退出

从每个点开始暴力dfs,记一个bool数组ins表示每个点是否在搜索栈中。如果发现可以松弛并且踏进了已经在栈中的点就说明找到了负环。

注意几点:

  1. YE5和N0 2333

  2. dis初始化为0,因为只要判负环,正权一开始并不用松弛

  3. 因为并没有说图连通,所以每个点都要作为起点跑一遍dfs

  4. 每个点都跑一遍有点麻烦,可以加一个剪枝,标记已经访问过的点,如果这个点之前已经松弛过了就不用再跑dfs了,反正也松弛不了。当然实际优化效果不是很理想,因为这个数组每次都要清空。。。。。。

#include<cstdio>
#include<cstring>
#define RG register
#define R RG int
#define gc if(++pi==iend)fread(pi=ibuf,1,SZ,stdin)
#define add(X,Y,V) v[++p]=V,to[p]=Y,ne[p]=he[X],he[X]=p
const int SZ=1<<20,N=200009,M=N<<1;
char ibuf[SZ],*iend=ibuf+SZ,*pi=iend-1;
int he[N],ne[M],to[M],v[M],d[N];
bool ins[N],vis[N];
inline int in(){
gc;while(*pi<'-')gc;
RG bool f=*pi=='-';if(f)gc;
R x=*pi&15;gc;
while(*pi>'-'){x*=10;x+=*pi&15;gc;}
return f?-x:x;
}
bool dfs(R x){
vis[x]=ins[x]=1;
for(R y,i=he[x];i;i=ne[i])
if(d[y=to[i]]>d[x]+v[i]){
d[y]=d[x]+v[i];//松弛
if(ins[y]||dfs(y))return !(ins[x]=0);//退回来记得把ins变成0
}
return ins[x]=0;
}
int main(){
R T=in(),n,m,p,a,b,w,i;
while(T--){
n=in();m=in();p=0;
while(m--){
a=in();b=in();w=in();
add(a,b,w);
if(w>=0)add(b,a,w);
}
for(i=1;i<=n;++i)
if(!vis[i]&&dfs(i)){
puts("YE5");
goto E;
}
puts("N0");
E:memset(he,0,(n+1)<<2);//都要清空
memset(d,0,(n+1)<<2);
memset(vis,0,n+1);
}
return 0;
}

洛谷P3385 【模板】负环(DFS求环)的更多相关文章

  1. 洛谷P3385 [模板]负环 [SPFA]

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

  2. 洛谷P3385判负环——spfa

    题目:https://www.luogu.org/problemnew/show/P3385 两种方法,dfs和bfs: 一开始写的dfs,要把dis数组初值赋成0,这样从一个连着负边的点开始搜: 在 ...

  3. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

  4. 【洛谷 P3385】模板-负环(图论--spfa)

    题目:有一个图有N个顶点,M条边.边用三个整数a b w表示,意思为a->b有一条权值为w的边(若w<0则为单向,否则双向).共T组数据.对于每组数据,存在负环则输出一行"YE5 ...

  5. 洛谷P2444 [POI2000]病毒(AC自动机,DFS求环)

    洛谷题目传送门 AC自动机入门--yyb巨佬的博客 AC自动机入手经典好题(虽然年代久远) 有了fail指针,trie树就不是原来的树型结构了,我们可以把它叫做trie图,由父节点向子节点连的边和fa ...

  6. 【AC自动机】洛谷三道模板题

    [题目链接] https://www.luogu.org/problem/P3808 [题意] 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. [题解] 不再介绍基础知识了,就是裸的模 ...

  7. 洛谷P3375 [模板]KMP字符串匹配

    To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...

  8. 洛谷1378 油滴扩展 dfs进行回溯搜索

    题目链接:https://www.luogu.com.cn/problem/P1378 题目中给出矩形的长宽和一些点,可以在每个点放油滴,油滴会扩展,直到触碰到矩形的周边或者其他油滴的边缘,求出剩余面 ...

  9. LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)

    为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...

随机推荐

  1. 非const引用不能指向临时变量

    没找到具体原因,MSDN看到下面这句,VC是从2008才有这一限制的,感觉就是从语法上对临时变量增加了限定,因为一般说来修改一个临时变量是毫无意义的,通过增加限定,强调临时变量只读语义.虽然实际上修改 ...

  2. MySQL 数据库赋予用户权限操作表

    MySQL清空数据库的操作:truncate table tablename; MySQL 赋予用户权限命令的简单格式可概括为:grant 权限 on 数据库对象 to 用户  一.grant 普通数 ...

  3. 2017-2018-2 20155231《网络对抗技术》实验八: WEB基础实验

    2017-2018-2 20155231<网络对抗技术>实验八:Web基础 实验要求: Web前端HTML(0.5分) 能正常安装.启停Apache.理解HTML,理解表单,理解GET与P ...

  4. 课程设计个人报告——基于ARM实验箱的Android交友软件的设计与实现

    个人贡献 熟悉试验箱各元件功能以及连接组装试验箱 一.实验内容 研究实验箱串口.USB线的调通连接 二.实践步骤 1.打开实验箱,首先了解各元件功能 这个是LTE模块,也叫4G模块,具体的作用是硬件将 ...

  5. Luogu P1273 有线电视网

    最近写DP写得比较多了 但是POJ上的题目太傻比了而且不想看英文的题面,然后就在Luogu的试炼场里找了一个DP EX专题写了一下(大概3days吧,一天一题差不多) 这是一道比较简单的DP 话说树形 ...

  6. debian系统下改语言设置

    debian系统下改语言设置 安装debian 的时候选择了中文zh_CN_UTF-8,然后进系统后想换成en_US_UTF-8 可以使用一下命令选择:找到需要的语言 确定即可 dpkg-reconf ...

  7. kvm虚拟化一: 图形化的管理方式

    1.安装必要工具yum install -y / qemu-kvm //kvm主程序 libvirt //虚拟化服务库 libguestfs-tools //虚拟机系统管理工具 virt-instal ...

  8. Python读取ini配置文件封装方法

    读取配置文件 ----rw_ini.py from configparser import ConfigParser def read_config(config_file_path:str): &q ...

  9. 升级framework4.0后form认证票据失效的问题

    好久没来了,密码都差点忘了,顺便记录下今天配置环境碰到的小问题 网站使用的form authentication做SSO登录,登录域名使用的framework20配置环境 一个栏目升级为4.0环境后, ...

  10. LeetCode 141. Linked List Cycle环形链表 (C++)

    题目: Given a linked list, determine if it has a cycle in it. To represent a cycle in the given linked ...