洛谷题目传送门

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. array_reduce()使用

    这个函数的作用是,把数组中的值循环放到回调函数里处理,结果返回一个单一的值.(applies iteratively the callback function to the elements of ...

  2. [Lydsy1805月赛]对称数 BZOJ5361

    分析: 这个题,还是蛮有趣的.考虑,如果l,r区间内的所有数出现奇数次,那么[l-1,r]的抑或和等于所得抑或和. 之后怎么维护呢,主席树维护区间抑或和,记得将每个点附上一个ull级别的随机数,之后抑 ...

  3. MariaDB数据库性能优化

    1. 硬件优化 1.1 内存(Memory) 内存是最重要的因素,因为它允许您调整服务器系统变量.更多的内存意味着可以将更大的密钥和表缓存存储在内存中,从而减少磁盘访问速度,降低一个数量级. 如果未将 ...

  4. 20155218《网络对抗》MSF基础应用

    20155218<网络对抗>MSF基础应用 实验过程 1.一个主动攻击实践,如ms08_067; 首先使用 search ms08_067查询一下该漏洞: show target 查看可以 ...

  5. 20155239吕宇轩《网络对抗》Exp3 免杀原理与实践

    20155239吕宇轩<网络对抗>Exp3 免杀原理与实践 实验过程 Kali使用上次实验msfvenom产生后门的可执行文件,上传到老师提供的网址http://www.virscan.o ...

  6. 通过定义过滤器filter解决跨域问题

            跨域是比较常见问题,比较简单的方式就是直接定义一个过滤器filter,然后在请求头里面加上一些参数.下面来看看具体的写法吧. 一.java代码 package com.hj.usera ...

  7. MySQL优化:explain using temporary

    什么时候会使用临时表:group/order没设计好的时候 1.order没用索引 2.order用了索引, 但不是和where相同的索引 3.order用了两个索引, 但不是联合索引 4.order ...

  8. 汇编 循环位移指令 ROL, 循环位移指令 ROR

    知识点:  循环位移指令 ROL  循环位移指令 ROR 一.循环位移指令 ROL ROR int i=0x77886611;//01110111100010000110011000010001 ...

  9. PostgreSQL安装和配置---Ubuntu

    PostgreSQL安装和配置---Ubuntu

  10. 阿里云Redis外网转发访问

    1.前提条件 如果您需要从本地 PC 端访问 Redis 实例进行数据操作,可以通过在 ECS 上配置端口映射或者端口转发实现.但必须符合以下前提条件: 若 Redis 实例属于专有网络(VPC),E ...