图的深度优先遍历

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

即深度优先搜索的核心就是对一个路径一直向下搜索,当搜索到头时就回溯到前一状态再寻找别的路

深搜问题一般有两种情况,一种是搜索时元素只能用有限次,这需要我们定义一个全局标记数组来对已经使用的数字进行标记。

如该题 排列数字

这道题的解法就是使用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的更多相关文章

  1. 图的深度优先遍历(DFS)和广度优先遍历(BFS)

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  2. 广度优先遍历-BFS、深度优先遍历-DFS

    广度优先遍历-BFS 广度优先遍历类似与二叉树的层序遍历算法,它的基本思想是:首先访问起始顶点v,接着由v出发,依次访问v的各个未访问的顶点w1 w2 w3....wn,然后再依次访问w1 w2 w3 ...

  3. 图的深度优先遍历DFS

    图的深度优先遍历是树的前序遍历的应用,其实就是一个递归的过程,我们人为的规定一种条件,或者说一种继续遍历下去的判断条件,只要满足我们定义的这种条件,我们就遍历下去,当然,走过的节点必须记录下来,当条件 ...

  4. 图的 储存 深度优先(DFS)广度优先(BFS)遍历

    图遍历的概念: 从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(Traversing Graph).图的遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础.图的 ...

  5. 图的深度优先遍历(DFS)—递归算法

    实验环境:win10, DEV C++5.11 实验要求: 实现图的深度优先遍历 实验代码: #include <iostream> #define maxSize 255 #includ ...

  6. 图的深度优先遍历(DFS) c++ 非递归实现

    深搜算法对于程序员来讲是必会的基础,不仅要会,更要熟练.ACM竞赛中,深搜也牢牢占据着很重要的一部分.本文用显式栈(非递归)实现了图的深度优先遍历,希望大家可以相互学习. 栈实现的基本思路是将一个节点 ...

  7. 16.boost图深度优先遍历DFS

    #include <iostream> #include <boost/config.hpp> //图(矩阵实现) #include <boost/graph/adjac ...

  8. 图的深度优先遍历(DFS)和广度优先遍历(BFS)算法分析

    1. 深度优先遍历 深度优先遍历(Depth First Search)的主要思想是: 1.首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点: 2.当没有未访问过的顶点时,则回 ...

  9. 深度优先遍历DFS

    深度优先遍历,这个跟树中的遍历类似,做深度遍历就是访问一个节点之后,在访问这个节点的子节点,依次下去是一个递归的过程. 具体代码: void DFS(MGraph g ,int i) {     in ...

  10. 树的深度优先遍历和广度优先遍历的原理和java实现代码

    import java.util.ArrayDeque; public class BinaryTree { static class TreeNode{ int value; TreeNode le ...

随机推荐

  1. Java面试——基础知识点

    JVM Jvm体系总体分四大块:类的加载机制.Jvm内存结构.GC算法垃圾回收.GC分析命令调优. 类的加载机制 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的 ...

  2. P3842-DP【黄】

    想搜索到最后一层,就必得先完成前面层的搜索任务,这构成了对状态转移的启示,即当前层的DP值应该是此前层转移过来后得到的最佳值. 但这道题看数据范围应该不能用二维数组,抱着侥幸的心理我使用了动态二维数组 ...

  3. hdu 5547

    ***题意:4*4数独,要求在同一行同一列不能有相同的数字,另外在2*2的小单元里也不能有相同的数字 思路:DFS暴力搜索, 每个位置填1-4,递归回溯,判断是否符合条件,递归到最后一个位置+1则输出 ...

  4. JMS微服务开发示例(八)双机热备

    双机热备,指两个一模一样的微服务,两个同时在运行,但是只有一个在工作,当工作中的微服务垮掉后,另一个会自行补上. 要实现这个,只需要设置 SingletonService = true. var mi ...

  5. MyBatis——第一个程序

    MyBatis1:初识 MyBatis第一个程序 流程:搭建环境–>导入MyBatis–>编写代码–>测试 1.创建一张User表. 关键字id.username.pwd 2.导入相 ...

  6. Go-插入排序

    // InsertSort 插入排序 // 思路: // 1. 第一个元素默认是已经排好序的 // 2. 从第二个元素开始,依次比较前面一个元素中,如果小于则交换位置 // 插入排序思路: 将一个元素 ...

  7. AspNetCore在docker里访问Oracle数据库的坑:ORA-01882: timezone region not found

    哦吼 之前刚说了尝试了使用docker来部署AspNetCore应用,结果这才刚上班就遇到问题了= =- 我这项目用的数据库是Oracle,之前直接运行没啥问题,但放在docker里运行就报了这个错误 ...

  8. [转帖]TiDB的系统变量

    TiDB 系统变量的行为与 MySQL 相似但有一些不同,变量的作用范围可以是全局范围有效 (Global Scope).实例级别有效 (Instance Scope) 或会话级别有效 (Sessio ...

  9. [转帖]linux shell 中数组的定义和for循环遍历的方法

    https://www.cnblogs.com/ysk123/p/11510718.html linux 中定义一个数据的语法为: variable=(arg1 arg2 arg3 ....) 中间用 ...

  10. [转帖]linux 内核协议栈 TCP time_wait 原理、配置、副作用

    https://my.oschina.net/u/4087916/blog/3051356   0. 手把手教你做中间件.高性能服务器.分布式存储技术交流群 手把手教你做中间件.高性能服务器.分布式存 ...