深入浅出,详解深度优先搜索(DFS)

您所在的位置:网站首页 图的遍历有哪些特点 深入浅出,详解深度优先搜索(DFS)

深入浅出,详解深度优先搜索(DFS)

2024-07-12 13:11| 来源: 网络整理| 查看: 265

深度优先搜索

如果把深度优先搜索比作一个人的话,那么这个人是一个执着的人,甚至倔强,不把一条路走到底不会返回(回溯),虽然执着倔强,但是他不傻,如果在探索的途中发现这条路走下去没有希望他会提前返回(剪枝),不会走到底再返回。

DFS最重要的是顺序,能不重不漏的搜索到每一个节点

深度优先搜索的数据结构为栈(stack)

深度优先搜索的两个注意事项:

回溯(回溯时要恢复原来状态)剪枝

小技巧:

每一个DFS都有一棵与之对应的递归搜索树,我们可以借助画图来帮我们理清思路

百度官方步骤参考:

深度优先遍历图的方法是,从图中某顶点v出发: (1)访问顶点v; (2)依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问; (3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。

模拟搜索过程

在这里插入图片描述

题目详解 例一:体现回溯

把 1∼n 这 n 个整数排成一行后随机打乱顺序,输出所有可能的次序。

输入格式 一个整数 n。

输出格式 按照从小到大的顺序输出所有方案,每行 1 个。

首先,同一行相邻两个数用一个空格隔开。

其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。

数据范围 1≤n≤9 输入样例:

3

输出样例:

1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1

题目分析: 当要求字典序的时候,我们从小到大枚举每个数,结果就是字典序。这里我们从位置的角度来思考问题,每个位置应该放哪些数。当第一个位置放1时…,放2时…,放3时…。

我们画出递归搜索树

具体步骤可参考本专栏另外一篇文章:递归 在这里插入图片描述

代码如下: #include #include #include #include using namespace std; const int N = 10; int n; int state[N]; // 0 表示还没放数,1~n表示放了哪个数 bool used[N]; // true表示用过,false表示还未用过 void dfs(int u) { if (u > n) // 边界 { for (int i = 1; i n; dfs(0, 0, 0); return 0; } 代码分析

在这里插入图片描述

此文章适合结合本专栏递归文章一起学习!


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3