我爱DFS序列搜索

news2024/11/27 16:27:56

什么是DFS?

DFS算法,即深度优先搜索(Depth-First Search)算法,是一种用于遍历或搜索图或树的算法。DFS算法可以解决诸如路径查找、图的连通性、拓扑排序以及树结构中的深度遍历等问题。然而,需要注意的是,由于DFS可能会访问整个图,因此在稠密图中可能效率较低。

官方的解释太抽象,不利于我们很好的理解,我们先来看下面这个二叉树,如果我们用DFS去遍历这个二叉树那么遍历的顺序是41532。

为什么会是41532?其实DFS的思想跟栈这个数据结构有很大关系,栈的特点就是先进后出。我们声明一个栈A,约定每次入栈一个当前节点没有入过栈的子节点,如果当前节点没有子节点,那么当前节点就退栈。接下来我会按照{栈A:当前节点:未入过栈的子节点:}的格式推理这个流程。

开始

4入栈

{栈A:4 当前节点:4 未入过栈子节点:1 5}

1入栈

{栈A:4 1 当前节点:1 未入过栈子节点:无}

1出栈

{栈A:4 当前节点:4 未入过栈子节点:5}

5入栈

{栈A:4 5 当前节点:5 未入过栈子节点:3 2}

3入栈

{栈A:4 5 3 当前节点:3 未入过栈子节点:无}

3出栈

{栈A:4 5 当前节点:5 未入过栈子节点:2}

2入栈

{栈A:4 5 2 当前节点:2 未入过栈子节点:无}

2出栈

根据入栈顺序

输出41532

结束


但很多人都是理解DFS的流程,但是写代码就会很蒙,我之前就是,一直认为算法题目中没有出现树,图等字眼,怎么用DFS呢?就很抽象。如果你DFS还仅限于理解而很难写代码的话,不如把下面的DFS实现数组全排列吃透,DFS其实也就那样了。

DFS实现数组全排列

#include <iostream>
#include <vector>
using namespace std;
const int N = 1e5;
vector<int> a(N);
vector<bool> b(N);
//b用来放这个节点是否被访问过
int n;

void dfs(int deepth)
{
// deepth代表当前的深度
    if (deepth == n)
// 如果深度到底了那么就回退
// 并输出入栈的顺序
    {
        for (int i = 0; i < n; i++)
        {
            cout << a[i] << " ";
        }
        cout << endl;
        return;
    }
    for (int i = 1; i <= n; i++)
    {
        if (b[i] == false)
//如果i还没有入栈
        {
            b[i] = true;
//那么i入栈
            a[deepth] = i;
//当前在深度入栈i
            dfs(deepth + 1);
//dfs(深度+1)
//向更深的地方探索
//当上一行的dfs(deepth + 1)
//退出了的话就说明到底了
//这个时候需要i出栈
            b[i] = false;

        }
    }
}

int main()
{
    cin >> n;
    dfs(0);
//意思是从第0层开始
    return 0;
}

如果理解了这个案例,那么就清楚了DFS可以实现全排列,换而言之,DFS可以考虑全部情况在某些场景下,比如:甲乙丙三人值日三天,有多少种安排方法?同时甲不能在奇数天,丙不能在偶数天,这个问题就可以用DFS解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1558381.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++基础12:标准模板库

此专栏为移动机器人知识体系下的编程语言中的 C {\rm C} C从入门到深入的专栏&#xff0c;参考书籍&#xff1a;《深入浅出 C {\rm C} C》(马晓锐)和《从 C {\rm C} C到 C {\rm C} C精通面向对象编程》(曾凡锋等)。 11.标准模板库 11.1 泛型化编程与STL简介 泛型化编程思想是一…

实践笔记-harbor搭建(版本:2.9.0)

harbor搭建 1.下载安装包&#xff08;版本&#xff1a;2.9.0&#xff09;2.修改配置文件3.安装4.访问harbor5.可能用得上的命令: 环境&#xff1a;centos7 1.下载安装包&#xff08;版本&#xff1a;2.9.0&#xff09; 网盘资源&#xff1a;https://pan.baidu.com/s/1fcoJIa4x…

垃圾回收机制--GC 垃圾收集器--JVM调优-面试题

1.触发垃圾回收的条件 新生代 Eden区域满了&#xff0c;触发young gc (ygc)老年代区域满了&#xff0c;触发full gc (fgc)通过ygc后进入老年代的平均大小大于老年代的可用内存,触发full gc(fgc).程序中主动调用的System.gc()强制执行gc,是full gc&#xff0c;但是不必然执行。…

KUKA机器人调整示教器灵敏度(校屏)

KUKA机器人KRC4的示教器升级后&#xff0c;示教器屏幕由之前的电阻屏改为电容屏&#xff0c;不仅在外观上有所变化&#xff0c;屏幕校准的方法也有所不同。通过以下方法分别对新旧两款示教器进行屏幕校正&#xff0c;调整示教器屏幕灵敏度。 对新款示教器而言&#xff1a; 一…

热烈祝贺阿里云PolarDB登顶2024最新一期中国数据库流行榜

热烈祝贺阿里云PolarDB登顶2024最新一期中国数据库流行榜 墨天轮墨天轮国产数据库流行度排行PolarDB首度夺魁关于话题的讨论数据库流行度排行榜会影响你的数据库选型吗&#xff1f;对于 PolarDB 的本次登顶&#xff0c;你认为关键因素是什么&#xff1f;PolarDB“三层分离”新版…

LeetCode-331. 验证二叉树的前序序列化【栈 树 字符串 二叉树】

LeetCode-331. 验证二叉树的前序序列化【栈 树 字符串 二叉树】 题目描述&#xff1a;解题思路一&#xff1a;看提示主要是栈和树。这题其实不是二叉树的遍历题&#xff0c;而是检验二叉树基础知识的题&#xff0c;也许有些难想。第一种解法是&#xff1a;把有效的叶子节点使用…

【OceanBase实战之路】第3篇:多租户架构实现资源隔离

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 目录 一、什么是OceanBase的多租户二、兼容模式2.1 MySQL 模式2.2 Oracle 模式三、租户介绍3.1 系统租户3.2 用户租户3.3 Meta 租…

强化基础-Java-泛型基础

什么是泛型&#xff1f; 泛型其实就参数化类型&#xff0c;也就是说这个类型类似一个变量是可变的。 为什么会有泛型&#xff1f; 在没有泛型之前&#xff0c;java中是通过Object来实现泛型的功能。但是这样做有下面两个缺陷&#xff1a; 1 获取值的时候必须进行强转 2 没有…

计算机网络-TCP/IP 网络模型

TCP/IP网络模型各层的详细描述&#xff1a; 应用层&#xff1a;应用层为应用程序提供数据传输的服务&#xff0c;负责各种不同应用之间的协议。主要协议包括&#xff1a; HTTP&#xff1a;超文本传输协议&#xff0c;用于从web服务器传输超文本到本地浏览器的传送协议。FTP&…

Linux 设备树: 设备树节点与属性在 dtb 文件中的存储

前言 当前新版本的 Linux 内核 设备驱动框架&#xff0c;与设备树&#xff08;Device Tree&#xff09;结合密切&#xff0c;整体 设备树的设备驱动框架&#xff0c;比较的庞大&#xff0c;但又非常的经典。 一个个的 设备树解析函数&#xff0c;都是前人【智慧】的结晶&#…

微服务监控:确保分布式系统的可观察性与稳定性

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 目录 一、前言二、微服务监控的重要性三、关键监控指标四、常用监控工具五、最佳实践六、结论 一、前言 在当前的软件开发领域&a…

2.快速排序

快速排序 思想&#xff1a;双指针法&#xff08;左右指针法&#xff09; 时间复杂度&#xff1a;O(n log n)&#xff08;最理想的情况下&#xff09; 最坏的情况&#xff1a;输入的数组已经是有序的或者接近有序时 快速排序的性能会退化到O(n^2) 我们的快速排序其实就是让两…

Wezterm配置

Windows 的图形界面目前来说在有图形界面的系统中&#xff0c;表现最稳定 linux 的终端最方便 和 tui 程序也多 我建议winodws安装 wsl 既可以使用 linux的环境和可以使用windows的桌面 关键 neovide --wsl 的表现很棒 如果项目的历史提交很多而且&#xff0c;工程很大&#xf…

C++STLmap,set

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

吴恩达2022机器学习专项课程(一) 4.4 学习率

问题预览/关键词 学习率太小有什么影响&#xff1f;学习率太大有什么影响&#xff1f;如果成本函数达到局部最小值&#xff0c;使用梯度下降还能继续最小化吗&#xff1f;为什么学习率固定&#xff0c;而最小化成本函数的步幅却越来越缓&#xff1f;如何选择合适的学习率&…

前端学习<二>CSS基础——12-CSS3属性详解:动画详解

前言 本文主要内容&#xff1a; 过渡&#xff1a;transition 2D 转换 transform 3D 转换 transform 动画&#xff1a;animation 过渡&#xff1a;transition transition的中文含义是过渡。过渡是CSS3中具有颠覆性的一个特征&#xff0c;可以实现元素不同状态间的平滑过渡…

2024 MCM数学建模美赛2024年A题复盘,思路与经验分享:资源可用性与性别比例 | 性别比例变化是否对生态系统中的其他生物如寄生虫提供优势(五)

审题 第四问让我们探究性别比例变化是否对生态系统中的其他生物如寄生虫提供优势。这里我们可以把问题简化一下&#xff0c;只探究性别比例会不会对寄生虫提供优势。因为考虑太多生物&#xff0c;会使模型更复杂&#xff0c;我这个水平处理不了这么复杂的问题&#xff0c;是我…

宠物领养(源码+文档)

宠物领养管理系统&#xff08;小程序、ios、安卓都可部署&#xff09; 文件包含内容程序简要说明含有功能项目截图客户端主页举报页注册页领养详细发布寻宠/送养领养页 管理端送养管理用户管理科普管理签到管理 文件包含内容 1、搭建视频 2、流程图 3、开题报告 4、数据库 5、…

【javaWeb 第八篇】后端-Mybatis(万字详细学习)

Mybatis框架 前言MybatisMybatis入门配置SQL提示JDBC数据库连接池lombok Mybatis基础操作日志输出Mybatis的动态SQL 前言 这篇是作者学习数据持久层框架Mybatis的学习笔记&#xff0c;希望对大家有所帮助&#xff0c;希望大家能够与作者交流讨论 Mybatis Mybatis是一款优秀的…

书生·浦语大模型实战营之轻松玩转书生·浦语大模型趣味案例

书生浦语大模型实战营 为了帮助社区用户高效掌握和广泛应用大模型技术&#xff0c;我们重磅推出书生浦语大模型实战营系列活动&#xff0c;旨在为开发者们提供全面而系统的大模型技术学习课程。加入我们&#xff0c;一起深入大模型全流程&#xff0c;从零搭建 RAG、多模态和智…