DFS深度优先搜索
概念引入
DFS 全称是 Depth First Search,中文名是深度优先搜索,是一种用于遍历或搜索树或图的算法。所谓深度优先,就是说每次都尝试向更深的节点走。
DFS 常常用来指代用递归函数实现的搜索,但实际上两者并不一样。
在 搜索算法 中,该词常常指利用递归函数方便地实现暴力枚举的算法,与图论中的 DFS 算法有一定相似之处,但并不完全相同。
在该文章中 仅讨论DFS搜索算法
DFS 搜索算法
例题p1706
1 |
|
思考
循环求解
哎?拿到这道题,第一想法是不是可以循环求解?
但是怎么用循环求解呢?
循环嵌套!!
因为这不是本文所讨论的方法,在这引用洛谷的一个题解 循环求解
1 |
|
可以看到,如果使用循环嵌套去解决,会非常非常麻烦(虽然这个题解还有优化的空间)。那么如果使用递归求解呢?
递归求解
1 |
|
有没有发现,在这个递归求解的方案中,递归会一路走到头,然后再输出解。其实这就是 DFS深度优先搜索 算法的思路。
算法思路分析
DFS算法的思路就是先一条路走到黑,如果行不通,就回溯到上一个节点,走另一条路,直到所有路径都走了一遍。
引用oi-wiki
1 |
|
对于例题,用DFS方法求解
1 |
|
在此,使用流程图的方式展示该方法的求解过程
graph TD
start["开始: dfs(1)"]
%% 第一层决策
n1["选择1: num[1]=1, vis[1]=true"]
n2["选择2: num[1]=2, vis[2]=true"]
n3["选择3: num[1]=3, vis[3]=true"]
%% 第二层决策(从选择1出发)
n1_2["选择2: num[2]=2, vis[2]=true"]
n1_3["选择3: num[2]=3, vis[3]=true"]
%% 第二层决策(从选择2出发)
n2_1["选择1: num[2]=1, vis[1]=true"]
n2_3["选择3: num[2]=3, vis[3]=true"]
%% 第二层决策(从选择3出发)
n3_1["选择1: num[2]=1, vis[1]=true"]
n3_2["选择2: num[2]=2, vis[2]=true"]
%% 第三层决策
n1_2_3["选择3: num[3]=3, vis[3]=true"]
n1_3_2["选择2: num[3]=2, vis[2]=true"]
n2_1_3["选择3: num[3]=3, vis[3]=true"]
n2_3_1["选择1: num[3]=1, vis[1]=true"]
n3_1_2["选择2: num[3]=2, vis[2]=true"]
n3_2_1["选择1: num[3]=1, vis[1]=true"]
%% 输出结果
out1["输出: 1 2 3"]
out2["输出: 1 3 2"]
out3["输出: 2 1 3"]
out4["输出: 2 3 1"]
out5["输出: 3 1 2"]
out6["输出: 3 2 1"]
%% 连接图
start --> n1
start --> n2
start --> n3
subgraph path1["路径1"]
n1 --> n1_2
n1 --> n1_3
n1_2 --> n1_2_3
n1_2_3 --> out1
n1_3 --> n1_3_2
n1_3_2 --> out2
end
subgraph path2["路径2"]
n2 --> n2_1
n2 --> n2_3
n2_1 --> n2_1_3
n2_1_3 --> out3
n2_3 --> n2_3_1
n2_3_1 --> out4
end
subgraph path3["路径3"]
n3 --> n3_1
n3 --> n3_2
n3_1 --> n3_1_2
n3_1_2 --> out5
n3_2 --> n3_2_1
n3_2_1 --> out6
end
%% 样式设置
classDef start fill:#9cf,stroke:#333,stroke-width:2px;
classDef node fill:#cfc,stroke:#333,stroke-width:1px;
classDef output fill:#fcf,stroke:#333,stroke-width:1px;
classDef back fill:#fcc,stroke:#333,stroke-width:1px;
class start start;
class n1,n2,n3,n1_2,n1_3,n2_1,n2_3,n3_1,n3_2,n1_2_3,n1_3_2,n2_1_3,n2_3_1,n3_1_2,n3_2_1 node
class out1,out2,out3,out4,out5,out6 output
class back1,back2,back3 back
(回溯等哪天有时间再补吧)
DFS深度优先搜索
http://blog.cat-boy.cn/2025/03/18/算法-DFS深度优先搜索/