深度優先搜索匯總

常用英文

最近公共祖先(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.pswp.cn/web/13133.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/13133.shtml
英文地址,請注明出處:http://en.pswp.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博客