深度优先搜索汇总

常用英文

最近公共祖先(Lowest Common Ancestor,简称LCA)
posterity,英语单词,主要用作名词,作名词时译为“子孙,后裔;后代”。

什么是深度优先搜索

深度优先搜索,Depth First Search, 简称DFS。它从初始节点出发,按预定的顺序扩展到下一个节点,然后从下一节点出发继续扩展新的节点,不断递归执行这个过程,直到某个节点不能再扩展下一个节点为止。此时,则返回上一个节点重新寻找一个新的扩展节点。如此搜索下去,直到找到目标节点,或者搜索完所有节点为止。
通俗的说:
每个节点都有选择类表,如果列表为空,则结束。否则依次DFS(x) , x ∈ \in 选择列表。节点中间的数字就是DFS序(时间戳)
在这里插入图片描述
某个节点为cur,它的任意祖先节点为anc,任意后代为pos。
深度优先有如下性质:
一,当DFS(cur)没有开始执行时,DFS(pos)一定没有开始执行。
二,当DFS(cur)执行结束时,DFS(pos)一定执行结束。
三,如果cur是长子节点,则DFS(cur)结束后。DFS(anc)正在执行,DFS(pos)已经执行结束。其它节点,都没有开始执行。
四,当前节点,可能是后代节点的前置条件,比如: 求层次(leve)。后代节点也可能是当前节点的前置条件,如:求后代数量。
五,DFS(cur)时的DFS序为time1 ,结束时的DFS序为time2。 则DFS序为[time1,time2)的节点 ⟺ \iff cur及cur的后代。

经典应用

无向图的DFS。需要cur节点parent,当next == parent 是忽略,否则无需循环{cur,parent,cur,parent ⋯ \cdots }
有向图,一般不需要,因为大部分情况是无环图。

封装类

枚举

CEnumNeiBo 枚举邻接点,如果有环,以第一次访问为准。CEnumChild 枚举孩子、无环、无向图。

class IDFSEnum
{
public:virtual void Enum(int cur, std::function<void(int)> fun) =0;virtual int NodeCount() = 0;virtual void Clear() = 0;};class CEnumNeiBo : public IDFSEnum
{
public:CEnumNeiBo(const vector<vector<int>>& vNeiBo) :m_vNeiBo(vNeiBo) {Clear();}virtual void Clear() override{ m_vVisit.assign(m_vNeiBo.size(), false); };
protected:virtual void Enum(int cur, std::function<void(int)> fun) override {m_vVisit[cur] = true;for (const auto& next : m_vNeiBo[cur]) {if (m_vVisit[next]) { continue; }fun(next);}}virtual int NodeCount() { return m_vNeiBo.size(); };const vector<vector<int>>& m_vNeiBo;vector<int> m_vVisit;
};class CEnumChild : public IDFSEnum
{
public:CEnumChild(const vector<vector<int>>& vChild) :m_vChild(vChild) {}
protected:virtual void Enum(int cur, std::function<void(int)> fun) override {for (const auto& next : m_vChild[cur]) {fun(next);}}virtual int NodeCount() { return m_vChild.size(); };virtual void Clear() override {};const vector<vector<int>>& m_vChild;
};

枚举各节点的孩子

class CDFSChild
{
public:const vector<vector<int>>& DFSChild(IDFSEnum& dfsEnum, int root) {dfsEnum.Clear();m_vChild.resize(dfsEnum.NodeCount());DFS(dfsEnum, root);return m_vChild;};
protected:void DFS(IDFSEnum& dfsEnum, int cur) {dfsEnum.Enum(cur, [&](int next) {m_vChild[cur].emplace_back(next); DFS(dfsEnum, next); });}vector<vector<int>> m_vChild;
};

计算各节点层次

class CDFSLeve 
{
public:vector<int>& DFSLeve(IDFSEnum& dfsEnum,int root) {dfsEnum.Clear();m_vLeve.assign(dfsEnum.NodeCount(), -1);m_vLeve[root] = 0;DFS(dfsEnum,root);return m_vLeve;}
protected:void DFS(IDFSEnum& dfsEnum, int cur) {dfsEnum.Enum(cur, [&](int next) {m_vLeve[next] = m_vLeve[cur] + 1; DFS(dfsEnum, next); });	}vector<int> m_vLeve;
};

暴力计算树直径

class CDFSForDiameter 
{
public:int DFSDiameter(IDFSEnum& dfsEnum, int root) {dfsEnum.Clear();m_iRet = 1;DFS(dfsEnum, root);return m_iRet;}
protected:int m_iRet = 1;//记录树的直径,0个节点的树会出错。int DFS(IDFSEnum& dfsEnum,int cur) {int left = 0;dfsEnum.Enum(cur, [&](int next) {auto right = DFS(dfsEnum,next);m_iRet = max(m_iRet, left + right + 1);left = max(left, right);});return left + 1;}
};

题解

无向树路径难度分
【深度优先搜索】【图论】【树】2646. 最小化旅行的价格总和2238
【图论】【树形dp】【深度优先搜索】2538. 最大价值和与最小价值和的差值2397
【树】【图论】【树路径】【深度优先搜索】2867. 统计树中的合法路径数目2428
C++深度优先搜索(DFS)算法的应用:2791树中可以形成回文的路径数2677
无向图难度分
【深度优先搜索 图论】:2925在树上执行操作以后得到的最大分数1939
【深度优先搜索】【树】【图论】2973. 树中每个节点放置的金币数目2276
【图论】【状态压缩】【树】【深度优先搜索】1617. 统计子树中城市之间最大距离2308
C++深度优先(DFS)算法的应用:2920收集所有金币可获得的最大积分2350
【树】【异或】【深度优先】【DFS时间戳】2322. 从树中删除边的最小分数2391
【深度优先搜索】【树】【C++算法】2003. 每棵子树内缺失的最小基因值2415
【树】【因子数】【数论】【深度优先搜索】2440. 创建价值相同的连通块2460
【动态规划】【树形dp】【深度优先搜索】LCP 26. 导航装置
有向图难度分
【归并排序】【图论】【动态规划】【 深度优先搜索】1569将子数组重新排序得到同一个二叉搜索树的方案数2288
【深度优先】LeetCode1932:合并多棵二叉搜索树2483
【深度优先搜索】【树】【有向图】【推荐】685. 冗余连接 II
其它难度分
【剪枝】【广度优先】【深度优先】488祖玛游戏
【深度优先搜索】【组合数学】【动态规划】1467.两个盒子中球的颜色数相同的概率2356

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
《喜缺全书算法册》以原理、正确性证明、总结为主。
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

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

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

相关文章

[前端] vue2的/deep/转化为vue3语法(笔记)

vue2语法示例 <style scoped lang"less">/deep/.el-carousel__button {width: 8px;height: 3px;border-radius: 3px;}/deep/.el-carousel__indicator.is-active button {width: 16px;} } </style>在 Vue 3 中&#xff0c;/deep/ 或 >>> 选择器…

24 内核开发- Linux 内核各种设计模式

24 内核开发- Linux 内核各种设计模式 Linux 内核中使用了各种设计模式来组织和结构其庞大的代码库。以下是 Linux 内核中的一些常见设计模式&#xff1a; 1. 单例模式&#xff1a; 模块&#xff1a; init 模块 目的&#xff1a; 初始化内核并创建第一个进程 (init_task) 实现…

uni-app 实现下拉单选功能(六)

总体的设计思想是,一个输入框在客户点击时,弹出需要选择的下拉框选项,客户选择完后,隐藏下拉框选项内容;并将选择的数据填充到输入框内。话不多说直接上代码: <template> <view class="dianjianInfo"> <view class="uni-form…

文心一言指令

文心一言 文心一言&#xff08;ERNIE Bot&#xff09;是百度公司研发的知识增强大语言模型&#xff0c;它可以根据用户的指令和输入&#xff0c;生成相应的回答或文本。以下是一些可能的指令示例&#xff0c;用于指导文心一言完成不同的任务&#xff1a; 知识问答&#xff1a…

【oracle】图片转为字节、base64编码等形式批量插入oracle数据库并查询

1.熟悉、梳理、总结下Oracle相关知识体系 2.欢迎批评指正&#xff0c;跪谢一键三连&#xff01; 资源下载&#xff1a; oci.dll、oraocci11.dll、oraociei11.dll3个资源文件资源下载&#xff1a; Instant Client Setup.exe资源下载&#xff1a; oci.dll、oraocci11.dll、oraoc…

LangChain_Tools

1、Tools 可以被Agent、Chain、LLM所使用。 2、tool 的必备属性有&#xff1a;name、description、JSON schema &#xff08;tool输入&#xff09;、调用的函数、工具的结果是否应直接返回给用户。其中name、description和 JSON schema 可用于提示 LLM、写入在LLM的system pro…

初识C语言——第二十一天

猜数字小游戏的实现&#xff1a; 学会了之后可以自己制作彩票抽奖&#xff0c;哈哈&#xff01; 代码实现&#xff1a; #include <stdlib.h> #include <time.h>void menu()//无返回值函数 {printf("**************************\n");printf("****…

Linux:退出vim编辑模式

一、使用快捷键进行退出 1、按“Esc”键进入命令模式 当我们在vim编辑模式下输入完毕需要进行退出操作时&#xff0c;首先需要按下“Esc”键&#xff0c;将vim编辑器从插入模式或者替换模式切换到命令模式。 ESC 2、输入“:wq”保存并退出 在命令模式下&#xff0c;输入“:…

在kubernetes中配置Ingress

目录 1. 安装Nginx Ingress Controller2. 准备TLS证书3. 编写Ingress资源定义4. 应用Ingress配置5. 验证配置 1. 安装Nginx Ingress Controller 首先&#xff0c;确保你的Kubernetes集群已经准备好。你可以使用Helm或者直接通过yaml文件来安装Nginx Ingress Controller。这里给…

云原生 初识Kubernetes的理论基础

一、k8s 的由来及其技术运用 1.1 k8s的简介 Kubernetes&#xff0c;词根源于希腊语的 舵手、飞行员。在国内又称k8s&#xff08;因为k和s之间有8个字母&#xff0c;所以得名。“国内程序员的幽默”&#xff09;。 作用&#xff1a; 用于自动部署、扩展和管理“容器化&#x…

利用远程控制软件FinalShell远程连接虚拟机上的Linux系统(Windows)

一. VMware Workstation 安装CentOS Linux操作系统 传送门&#xff1a;VMware Workstation 安装CentOS Linux操作系统 1.右键打开终端 2.输入ifconfig 找到ens33对应 inet的id&#xff0c;这个就是虚拟机的ip地址图中所示为&#xff1a;192.168.5.128 3.打开finalshell 如…

如何使用 PuTTY 创建 SSH 密钥以连接到 VPS

公钥和私钥 SSH 密钥的好处 如果您的无头或远程 VPS 可以通过互联网访问&#xff0c;您应该尽可能使用公钥身份验证而不是密码。这是因为与仅使用密码相比&#xff0c;SSH 密钥提供了一种更安全的登录方式。虽然密码最终可以通过暴力破解攻击破解&#xff0c;但 SSH 密钥几乎不…

C++ | Leetcode C++题解之第92题反转链表II

题目&#xff1a; 题解&#xff1a; class Solution { public:ListNode *reverseBetween(ListNode *head, int left, int right) {// 设置 dummyNode 是这一类问题的一般做法ListNode *dummyNode new ListNode(-1);dummyNode->next head;ListNode *pre dummyNode;for (i…

抽象类介绍

抽象类 【一】什么是抽象 # 将某几个具体的生物&#xff0c;根据特征总结成一个类&#xff0c;逐层向上总结 # 唐老鸭 肉鸭 北京烤鸭 ---> 鸭子 # 北极熊 黑熊 --> 熊 # 猫 老虎 --> 猫科 # 鸭子 熊 猫科 --> 动物 【二】什么是继承 # 动物 ---> 熊 --->…

【刷题篇】二分查找(二)

文章目录 1、山脉数组的峰顶索引2、寻找峰值3、寻找旋转排序数组中的最小值4、LCR 点名 1、山脉数组的峰顶索引 符合下列属性的数组 arr 称为 山脉数组 &#xff1a; arr.length > 3 存在 i&#xff08;0 < i < arr.length - 1&#xff09;使得&#xff1a; arr[0] &l…

macOS Ventura 13如何设置定时重启(命令行)

文章目录 macOS Ventura 13如何设置定时重启(命令行)前言具体设置步骤及命令解释其他 macOS Ventura 13如何设置定时重启(命令行) 前言 由于升级 macOS 13 Ventura 之后&#xff0c;之前在节能里面通过鼠标点击设置开机关机的方法不能用了&#xff0c;现在只能用命令设置开机…

css笔记总结2

找到所有的 h1 标签。 选择器&#xff08;选对人&#xff09; 设置这些标签的样式&#xff0c;比如颜色为红色&#xff08;做对事&#xff09;。 ##css基础选择器 基础选择器又包括&#xff1a;标签选择器、类选择器、id 选择器和通配符选择器 ###标签选择器&#xff1a; 标签…

【PB案例学习笔记】-03用户名密码校验

写在前面 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gitee代码仓库https://gitee.com/xiezhr/pb-project-example.git 需要源代码的小伙伴们可以自行…

KNN算法处理多元分类任务

概述 这个案例还是基于之前的案例进行改造。 之前的案例代码完整如下&#xff1a; from sklearn.datasets import make_blobs # KNN 分类器 from sklearn.neighbors import KNeighborsClassifier # 画图工具 import matplotlib.pyplot as plt # 数据集拆分工具 from sklearn…

ur5 moveit配置过程

ros-noeticur5机械臂抓取仿真_ros机械臂视觉抓取仿真-CSDN博客