DFS:入门
电脑食用更佳~
基本概念
深度优先搜索算法(Depth First Search,简称DFS,深搜):一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(n!)。
然而,不会有人看这个就可以学会的,所以这个玩意看看就好
通俗来讲,这个算法叫深度优先搜索,而搜索也可以理解为遍历,或者是全部找一遍。
可以百度的搜索一下,当你输入信息时,他会找到与你所输入的信息相匹配的所有东西,其中的原理就可以理解为(实际当然不是)就是他把互联网上的信息全部找了一遍,然后再输出了你想要的信息。这也就是搜索的概念。
而深度优先搜索(就是在搜索前面加上了深度优先)就是一种搜索的方式,使用它可以使我们的搜索更加清楚,逻辑更加清晰。
前置知识
由于深搜建立在一颗搜索树上,所以默认需要学会树和图(学不会的走人)如果对图和树没有一个很好的理解的话,建议看看这个:树 传送门
[图传送门]( https://blog.csdn.net/qiancm/article/details/119612514#:~:text=C%2B%2B 的 图 的基本概念 1. 有向 ,%E5%9B%BE%3A%20%E9%A1%B6%E7%82%B9%E4%B8%8E%E9%A1%B6%E7%82%B9%E4%B9%8B%E9%97%B4%E9%80%9A%E8%BF%87%E5%BC%A7%E7%9B%B8%E8%BF%9E%E6%8E%A5%3B%202.%20%E6%97%A0%E5%90%91%20%E5%9B%BE%3A%20%E9%A1%B6%E7%82%B9%E4%B8%8E%E9%A1%B6%E7%82%B9%E4%B9%8B%E9%97%B4%E9%80%9A%E8%BF%87%E6%97%A0%E5%90%91%E8%BE%B9%E7%9B%B8%E8%BF%9E%E6%8E%A5%3B%203.)
建议是看看定义就好,不需要过多深入。
正片
好,现在假装你学会树和图了,我们来看看深搜到底是什么算法:











(我才不是抄的)
主要意思大家应该已经明白了,就是一条路走到黑,不撞南墙不回头,只要能往下走就一直往下走,直到走到不能走或者满足条件为止。那么这个是通俗的语言,用伪代码来写就是:
dfs(...) //含义:(!!)准备 对当面步 做决定
{
if(ok==1)
return;
if(该决定不符合条件) // 11
return;
if(到终点)
{
ok=1;
...
return;
}
...
do //有时 当前步只有一个决定
{
(1)对当前步 做第一个决定;
进行数据处理 !!
for(int i=1;i<=...;i++)
{
dfs(next); //直接进行下一个决定,下一个决定是否正确在11处判断,不在该处判断,否则可能如果输入只做一个决定就结束了,不会判断到第一步的错误
}
还原,以便做其他决定; !!! 注意不是dfs(next)的还原!!
(2)对当前步 做第二个决定;
进行数据处理
for(int i=1;i<=...;i++)
{
dfs(next);
}
还原,以便做其他决定;
}
}
这样就差不多结束了,我们再看一个经典的例题(建议分屏食用):例题传送门
完结+练习
可以去找找这几个题目练练手:
P1219(就是例题), P3958,P1135,POJ1321(难度递增……吧?)
还有一个英文题面的题目:

浙公网安备 33010602011771号