浅谈DFS

· · 个人记录

DFS,即深度优先搜索,是一种很常见但并不难的算法,可以用来解决很多东西。就像 n^{3} 的暴力无所不能一样我们来谈一谈它的优化和结构吧!

DFS函数一般由边界条件、主体和递归组成,我们来挨个探讨一下

1.边界条件

DFS中的边界条件有很多,例如对一个m位的数组填数字时填到m+1位啦,找一个连续的正整数序列时碰到0啦,等等。但它们的共同作用是让函数递归结束,返回上一层。

在第一种情况中,(即对一个m位的数组填数字时填到m+1位),可以考虑更新答案(就是我们dfs的目的),但有时也是输出一个序列(例:P1706)。这时,我们需要在回溯之前更新,防止未更新就返回了

伪代码:

if 边界条件 {更新(或输出);回溯;}

2.主体

这就是一个函数的主要部分了,通常就是递归部分,但在部分题目中在递归前需要对某些值进行预处理。

3.递归

这是一个函数最重要的部分,它写的好坏决定了dfs的效率,递归的基本原则希望大家记住:递归前改的值,递归后一定要改回去!

我们假定我们需要找到 6 这个数,在图中,我们并不需要优化;但如果有1000000,10000000个节点呢?这样朴素的算法岂不会超时?

于是,优化应运而生。

在有了这些优化后,你的dfs一定会很快的!(不过如果不是dfs能跑的常数你非要跑kkk也救不了你)