图(树)的深度优先遍历dfs
图的深度优先遍历
深度优先,即对于一个图或者树来说,在遍历时优先考虑图或者树的单一路径的深度。示意图如下

即深度优先搜索的核心就是对一个路径一直向下搜索,当搜索到头时就回溯到前一状态再寻找别的路
深搜问题一般有两种情况,一种是搜索时元素只能用有限次,这需要我们定义一个全局标记数组来对已经使用的数字进行标记。
如该题 排列数字
这道题的解法就是使用dfs枚举各种情况。当dfs时,其实就是在遍历一棵使用递归建成的搜索树。
题解代码如下
#include <iostream>
using namespace std;
const int N = 20;
int ans[N]; //答案存储数组
int n;
int cnt; //答案个数记录,用于写递归出口
bool check[N]; // 标记
void dfs()
{
if(cnt == 3)
{
for(int i = 0 ; i < 3 ; i++)
cout << ans[i] << ' ';
cout << '\n';
return;
}
for(int i = 1 ; i <= n ; i++)
{
if(!check[i])
{
ans[cnt++] = i;
check[i] = true;
dfs();
/*回溯*/
check[i] = false;
cnt --;
}
}
}
int main()
{
cin >> n;
dfs();
return 0;
}
注意!当dfs时一定别忘了写递归出口,递归出口的条件一般就为题目要求的筛选条件
dfs函数中的for循环其实就是枚举每一层的各种情况。
其实本道题还有更为方便的解法,利用algorithm库中的next_permutation函数可以轻松的解决字典序全排列问题。
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 20;
int ans[N]; //答案存储数组
int n;
int main()
{
cin >> n;
for(int i = 0 ; i <= n ; i++ )
ans[i] = i + 1;
do
{
for(int i = 0 ; i < n ; i++)
cout << ans[i] << ' ';
cout << '\n';
}while(next_permutation(ans, ans+n));
return 0;
}
该函数的作用请见next_permutation
图(树)的深度优先遍历dfs的更多相关文章
- 图的深度优先遍历(DFS)和广度优先遍历(BFS)
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- 广度优先遍历-BFS、深度优先遍历-DFS
广度优先遍历-BFS 广度优先遍历类似与二叉树的层序遍历算法,它的基本思想是:首先访问起始顶点v,接着由v出发,依次访问v的各个未访问的顶点w1 w2 w3....wn,然后再依次访问w1 w2 w3 ...
- 图的深度优先遍历DFS
图的深度优先遍历是树的前序遍历的应用,其实就是一个递归的过程,我们人为的规定一种条件,或者说一种继续遍历下去的判断条件,只要满足我们定义的这种条件,我们就遍历下去,当然,走过的节点必须记录下来,当条件 ...
- 图的 储存 深度优先(DFS)广度优先(BFS)遍历
图遍历的概念: 从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(Traversing Graph).图的遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础.图的 ...
- 图的深度优先遍历(DFS)—递归算法
实验环境:win10, DEV C++5.11 实验要求: 实现图的深度优先遍历 实验代码: #include <iostream> #define maxSize 255 #includ ...
- 图的深度优先遍历(DFS) c++ 非递归实现
深搜算法对于程序员来讲是必会的基础,不仅要会,更要熟练.ACM竞赛中,深搜也牢牢占据着很重要的一部分.本文用显式栈(非递归)实现了图的深度优先遍历,希望大家可以相互学习. 栈实现的基本思路是将一个节点 ...
- 16.boost图深度优先遍历DFS
#include <iostream> #include <boost/config.hpp> //图(矩阵实现) #include <boost/graph/adjac ...
- 图的深度优先遍历(DFS)和广度优先遍历(BFS)算法分析
1. 深度优先遍历 深度优先遍历(Depth First Search)的主要思想是: 1.首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点: 2.当没有未访问过的顶点时,则回 ...
- 深度优先遍历DFS
深度优先遍历,这个跟树中的遍历类似,做深度遍历就是访问一个节点之后,在访问这个节点的子节点,依次下去是一个递归的过程. 具体代码: void DFS(MGraph g ,int i) { in ...
- 树的深度优先遍历和广度优先遍历的原理和java实现代码
import java.util.ArrayDeque; public class BinaryTree { static class TreeNode{ int value; TreeNode le ...
随机推荐
- HTTP Headers Content-Type 详解
https://www.cnblogs.com/whosmeya/p/14315632.html
- 机器学习-线性回归-损失函数+正则化regularization-06
目录 1. 为什么要加上正则项 2 L1稀疏 L2平滑 3. 代码1--L2正则 4 代码2--L2正则2 5. 代码3--l1正则 6. ElasticNet 1. 为什么要加上正则项 防止模型的过 ...
- 【Linux】技术收集
Linux进程间通信(六)---信号量通信之semget().semctl().semop()及其基础实验 https://blog.csdn.net/mybelief321/article/deta ...
- Mongo-关系型VS非关系型
关系型 vs 非关系型 数据库 表 vs 集合 行 vs 文档 列 vs 成员 主键 vs objectId NoSQL => not only sql 是一种互补关系 BSON <= j ...
- [转帖]jmeter之foreach循环控制器-03篇
上篇我们通过正则表达式获取到了一组数据,那么怎么来用呢?下面就用foreach控制器来使用结果,如下图所示 然后再foreach控制器里添加要循环的请求,我们模拟百度搜索,value填入${id} 然 ...
- [转帖]一次操作系统报错OutOfMemory Error的处理记录
在启动公司内嵌的tomcat容器时出现报错, 如下: # There is insufficient memory for the Java Runtime Environment to contin ...
- [转帖]dd命令中dsync和fsync区别
在Linux系统中经常会使用dd命令来测试硬盘的写入速度,命令会涉及几个常用参数:sync.dsync.fsync与fdatasync # dd if=/dev/zero of=/tmp/1G bs= ...
- 银河麒麟系统信息获取V1.0版本
银河麒麟系统信息获取 摘要 最近项目有一些兼容性测试需求. 可能需要获取一些系统配置信息便于相关的工作. 想着自己总结一下. 便于后续的不太熟悉的同事进行简要处理 银河麒麟获取版本 nkvers # ...
- TCP内核参数与Nginx配置的简单测试
背景 昨天晚上整理了下几个TCP内核的参数. 学习到了一点内核参数的影响. 但是因为时间比较晚了没有继续钻研与nginx的关系 今天想着继续研究一下TCP的部分参数与nginx的关系 每个系统都不一样 ...
- OpenPower机器上面搭建RabbitMQ 以及简单进行用户配置的方法
OpenPower机器上面搭建RabbitMQ 以及简单进行用户配置的方法 公司有一台性能比较好的power机器. 同事要求安装rabbitmq 今天尝试进行了一下处理 公司里面有网络有相应的源 性能 ...