码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 第六章 图 五、图的深度优先遍历(DFS算法)


    目录

    一、定义

    深度优先遍历通常用于解决以下问题:

    深度优先遍历算法具有以下优点:

    深度优先遍历算法的一个缺点是:

    二、代码

    空间复杂度:

    时间复杂度:

    邻接矩阵存储:

    邻接表存储:

    三、手动模拟深度优先遍历⭐⭐⭐⭐⭐

    1、首先访问结点2

    2、访问2的邻接点6

    3、跳转到6,访问6的邻接结点,发现2已经被访问过了,于是访问7

    4、跳转到7,访问7的邻接结点,6被访问过了所以跳过,访问8

    5、跳转到8,访问8的邻接结点,访问4

    6、继续访问跳转到4,访问4的邻接结点,访问3

    7、跳转到3,访问3的邻接结点,访问6,6被访问过了(跳过),访问7(跳过),访问4(跳过),由于3的邻接结点都被访问完了,所以返回上一级;

    8、遍历4,访问8(跳过),访问7(跳过),返回上一级;

    9、上一级是8,所以遍历8,访问7(跳过),返回上一级;

    10、遍历7,访问3(跳过),访问4(跳过),返回上一级;

    11、遍历6,访问3(跳过),返回上一级;

    12、遍历2,访问1;

    13、跳转至1,访问2(跳过),访问5;

    14、跳转至5,访问1,跳过;

    至此,邻接表所有结点全部访问完毕。

    四、深度优先生成树

    五、深度优先生成森林

    六、图的遍历与图的连通性

    无向图:

    有向图:


    一、定义

    1、深度优先遍历(Depth-First Search, DFS)是一种遍历或搜索图的算法。

    2、该算法从图的某一个起始节点开始,递归地探索该节点的所有邻居节点,直到找出整个图的连通部分。

    3、DFS使用了栈的数据结构来保存待访问的节点。

    4、当访问一个节点时,我们将该节点入栈,并将其标记为已访问。

    然后,如果该节点有未访问的邻居节点,我们就将邻居节点入栈并标记为已访问。

    这个过程一直持续到栈为空为止。当栈为空时,我们就完成了整个图的深度优先遍历。

    深度优先遍历通常用于解决以下问题:

    • 检测一个无向图是否为连通图。
    • 搜索一条路径,例如在迷宫中从起点到终点的最短路径。
    • 找出一个无向图的所有连通分量。

    深度优先遍历算法具有以下优点:

    • 实现简单。
    • 占用的空间相对较小,因为它只需要一个栈来保存待访问的节点。
    • 适用于解决一些基于图的问题。

    深度优先遍历算法的一个缺点是:

    它可能会陷入无限循环中,因为它只是深度优先探索邻居节点,而不是考虑整个图的结构。这种缺点可以通过引入剪枝策略来解决,例如标记已访问的节点,或者设置搜索的深度限制。

    二、代码

    1. #include
    2. #include
    3. using namespace std;
    4. void DFS(int start, vectorint>>& graph, vector<bool>& visited) {
    5. visited[start] = true; // 标记当前节点为已访问
    6. cout << start << " "; // 输出遍历到的节点
    7. for (int i = 0; i < graph[start].size(); i++) {
    8. int next = graph[start][i];
    9. if (!visited[next]) { // 如果下一个节点未被访问
    10. DFS(next, graph, visited); // 递归访问下一个节点
    11. }
    12. }
    13. }
    14. int main() {
    15. // 构建一个图
    16. vectorint>> graph = {{1, 2}, {0, 3, 4}, {0, 5, 6}, {1}, {1}, {2}, {2, 7}, {6}};
    17. vector<bool> visited(graph.size(), false); // 初始化所有节点为未访问状态
    18. DFS(0, graph, visited); // 从节点0开始深度优先遍历
    19. return 0;
    20. }

    空间复杂度:

    最好情况:

    最坏情况:

    时间复杂度:

    邻接矩阵存储:

    邻接表存储:

    三、手动模拟深度优先遍历⭐⭐⭐⭐⭐

    假如我们由如下邻接表:

    我们要得到从2开始的深度优先遍历序列。

    1、首先访问结点2

    此时,遍历序列为

    2、访问2的邻接点6

    此时,遍历序列为

    3、跳转到6,访问6的邻接结点,发现2已经被访问过了,于是访问7

    此时,遍历序列为

    4、跳转到7,访问7的邻接结点,6被访问过了所以跳过,访问8

    此时,遍历序列为

    5、跳转到8,访问8的邻接结点,访问4

    此时,遍历序列为

    6、继续访问跳转到4,访问4的邻接结点,访问3

    此时,遍历序列为

    7、跳转到3,访问3的邻接结点,访问6,6被访问过了(跳过),访问7(跳过),访问4(跳过),由于3的邻接结点都被访问完了,所以返回上一级;

    8、遍历4,访问8(跳过),访问7(跳过),返回上一级;

    9、上一级是8,所以遍历8,访问7(跳过),返回上一级;

    10、遍历7,访问3(跳过),访问4(跳过),返回上一级;

    11、遍历6,访问3(跳过),返回上一级;

    12、遍历2,访问1;

    此时,遍历序列为

    13、跳转至1,访问2(跳过),访问5;

    此时,遍历序列为

    14、跳转至5,访问1,跳过;

    至此,邻接表所有结点全部访问完毕。

    得到深度优先遍历序列为:2、6、7、8、4、3、1、5

    四、深度优先生成树

    与广度优先生成树相似,都是把每个结点第一次被访问的路径提取出来所生成的树,就是生成树

    以下图为例:

    我们从2开始访问,把每个结点第一次被访问的路径标红,这就是生成树。

    注意:

    五、深度优先生成森林

    我们多加一个图

    然后表示出它的深度优先生成树,写在一起,就是深度优先生成森林

    六、图的遍历与图的连通性

    无向图:

    有向图:

  • 相关阅读:
    Linux cp 命令使用介绍
    程序员必知必会网络传输之TCP/IP协议族,共864页的详解文档让你原地起飞!
    Go语言的断点续传
    基于MobileNet的轻量级卷积神经网络实现玉米螟虫不同阶段识别分析
    Defocus(散焦)
    Android 动态分区详解(五) 为什么没有生成 super.img?
    CSS Form表单布局
    边缘云服务提供商[网心科技],入选2022信通院“可信边缘计算推进计划”首批成员单位
    深度学习100例——卷积神经网络(CNN)实现服装图像分类
    金九银十躺平证!全靠这份2022阿里扫地僧分享的Java面试小册,轻松拿捏
  • 原文地址:https://blog.csdn.net/icbbm/article/details/132794544
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号