第六章 图 五、图的深度优先遍历(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、当访问一个节点时,我们将该节点入栈,并将其标记为已访问。
然后,如果该节点有未访问的邻居节点,我们就将邻居节点入栈并标记为已访问。
这个过程一直持续到栈为空为止。当栈为空时,我们就完成了整个图的深度优先遍历。
深度优先遍历通常用于解决以下问题:
- 检测一个无向图是否为连通图。
- 搜索一条路径,例如在迷宫中从起点到终点的最短路径。
- 找出一个无向图的所有连通分量。
深度优先遍历算法具有以下优点:
- 实现简单。
- 占用的空间相对较小,因为它只需要一个栈来保存待访问的节点。
- 适用于解决一些基于图的问题。
深度优先遍历算法的一个缺点是:
它可能会陷入无限循环中,因为它只是深度优先探索邻居节点,而不是考虑整个图的结构。这种缺点可以通过引入剪枝策略来解决,例如标记已访问的节点,或者设置搜索的深度限制。
二、代码
#include <iostream>
#include <vector>using namespace std;void DFS(int start, vector<vector<int>>& graph, vector<bool>& visited) {visited[start] = true; // 标记当前节点为已访问cout << start << " "; // 输出遍历到的节点for (int i = 0; i < graph[start].size(); i++) {int next = graph[start][i];if (!visited[next]) { // 如果下一个节点未被访问DFS(next, graph, visited); // 递归访问下一个节点}}
}int main() {// 构建一个图vector<vector<int>> graph = {{1, 2}, {0, 3, 4}, {0, 5, 6}, {1}, {1}, {2}, {2, 7}, {6}};vector<bool> visited(graph.size(), false); // 初始化所有节点为未访问状态DFS(0, graph, visited); // 从节点0开始深度优先遍历return 0;
}
空间复杂度:
最好情况:

最坏情况:

时间复杂度:

邻接矩阵存储:
![]()
邻接表存储:
![]()
三、手动模拟深度优先遍历⭐⭐⭐⭐⭐
假如我们由如下邻接表:

我们要得到从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开始访问,把每个结点第一次被访问的路径标红,这就是生成树。
注意:

五、深度优先生成森林
我们多加一个图

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

六、图的遍历与图的连通性
无向图:

有向图:

相关文章:
第六章 图 五、图的深度优先遍历(DFS算法)
目录 一、定义 深度优先遍历通常用于解决以下问题: 深度优先遍历算法具有以下优点: 深度优先遍历算法的一个缺点是: 二、代码 空间复杂度: 时间复杂度: 邻接矩阵存储: 邻接表存储: 三、…...
React 中的 useLayoutEffect 钩子函数
useLayoutEffect钩子函数的作用跟useEffect钩子函数的作用一样,它们的不同主要是在于: 1、useEffect钩子函数是异步的,因为此函数在执行的时候是先计算出所有的 Dom 节点的改变后再将对应的 Dom 节点渲染到屏幕上,然而在 useEffe…...
upload-labs1-21关文件上传通关手册
upload-labs文件上传漏洞靶场 目录 upload-labs文件上传漏洞靶场第一关pass-01:第二关Pass-02第三关pass-03:第四关pass-04:第五关pass-05:第六关pass-06:第七关Pass-07第八关Pass-08第九关Pass-09第十关Pass-10第十一…...
MATLAB遗传算法求解生鲜货损制冷时间窗碳排放多成本车辆路径规划问题
MATLAB遗传算法求解生鲜货损制冷时间窗碳排放多成本车辆路径规划问题实例 1、问题描述 已知配送中心和需求门店的地理位置,并且已经获得各个门店的需求量。关于送货时间的要求,门店都有规定的时间窗,对于超过规定时间窗外的配送时间会产生相应的惩罚成本。为保持生鲜农产品的…...
界面控件DevExpress .NET应用安全 Web API v23.1亮点:支持Swagger模式
DevExpress拥有.NET开发需要的所有平台控件,包含600多个UI控件、报表平台、DevExpress Dashboard eXpressApp 框架、适用于 Visual Studio的CodeRush等一系列辅助工具。 DevExpress 今年第一个重要版本v23.1日前已正式发布了,该版本拥有众多新产品和数十…...
SpringMVC之CRUD------增删改查
目录 前言 配置文件 pom.xml文件 web.xml文件 spring-context.xml spring-mvc.xml spring-MyBatis.xml jdbc.properties数据库配置文件 generatorConfig.xml log4j2日志文件 后台 PageBaen.java PageTag.java 切面类 biz层 定义一个接口 再写一个实现类 …...
微信小程序开发教学系列(4)- 抖音小程序组件开发
章节四:抖音小程序组件开发 在本章中,我们将深入探讨抖音小程序的组件开发。组件是抖音小程序中的基本构建块,它们负责展示数据和与用户交互。了解组件的开发方法和使用技巧是进行抖音小程序开发的重要一步。 4.1 抖音小程序的基本组件 抖…...
RabbitMQ反序列化失败:Failed to convert message
🎈 1 参考文档 RabbitMQ消费消息坑:failed to convert serialized Message content | jiuchengi-cnblogs 🔍2 问题描述 org.springframework.amqp.rabbit.support.ListenerExecutionFailedException: Failed to convert messageat org.sprin…...
CTFSHOW 年CTF
1.除夕 php的弱类型,用小数点绕过 这里后面直接加字母不行 2.初三 error_reporting(0); extract($_GET); include "flag.php"; highlight_file(__FILE__); 这里通过extract将get的参数导入为了变量 $_function($__,$___){return $__$___?$___:$__; }; …...
肖sir__设计测试用例方法之状态迁移法05_(黑盒测试)
设计测试用例方法之状态迁移法 一、状态迁移图 定义:通过描绘系统的状态及引起系统状态转换的事件,来表示系统的行为 案例: (1) 订机票案例1: l向航空公司打电话预定机票—>此时机票信息处于“完成”状…...
无涯教程-JavaScript - IMPRODUCT函数
描述 IMPRODUCT函数以x yi或x yj文本格式返回1到255个复数的乘积。两个复数的乘积为- $$(A BI)(C DI)(AC-BD)(A B)1 $$ 语法 IMPRODUCT (inumber1, [inumber2] ...)争论 Argument描述Required/OptionalInumber11 to 255 complex numbers to multiply.Required[inumbe…...
yapi以及gitlab的容器化部署
yapi部署: https://blog.csdn.net/Chimengmeng/article/details/132074922 gitlab部署 使用docker-compose.yml version: 3 services: web: image: twang2218/gitlab-ce-zh:10.5 restart: always hostname: 192.168.xx.xx environm…...
TCP、UDP 协议的区别,各自的应用场景
分析&回答 TCP 传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能&…...
C高级 DAY3
一、shell中的变量 shell本身是擅长运行指令,是一种弱数据类型语言 它与c语言中定义变量有所不同 C中: 存储类型 数据类型 变量名;shell中: 变量变量的值 ----->如果变量的值中间没有空格直接使用 变量变量的值 ----->变量…...
Linux CentOS7命令及命令行
Linux CentOS7中命令及命令行是非常重要的概念。对大多数初学者来说是既熟悉又了解甚少。本文初步讨论这方面的内容,与同行者交流。 一、命令 命令又称为指令,(英语命令 command,可用简写cmd表示),在终端…...
【C++入门到精通】C++入门 ——搜索二叉树(二叉树进阶)
阅读导航 前言一、搜索二叉树简介1. 概念2. 基本操作⭕搜索操作🍪搜索操作基本代码(非递归) ⭕插入操作🍪插入操作基本代码(非递归) ⭕删除操作🍪删除操作基本代码(非递归࿰…...
学成在线-网站搭建
文章目录 代码素材来自b站pink老师 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>学成在线首…...
stm32同芯片但不同flash工程更换Device出现报错
目录 1. 问题描述2. 解决方案 1. 问题描述 stm32同芯片但不同flash工程更换Device出现报错 2. 解决方案 更换Device,我是从ZE换为C8: 把这个从HD更换为MD 解决!...
Element UI实现每次只弹出一个Message消息提示
前言 在开发Web应用程序时,我们经常需要使用消息提示来向用户展示重要信息。Element UI提供了一个方便易用的组件——Message,可以用于显示各种类型的消息提示。 然而,默认情况下,当多个消息提示同时触发时,它们会依…...
「网页开发|前端开发|Vue」04 快速掌握开发网站需要的Vue基础知识
本文主要介绍使用Vue进行前端开发的一些必备知识,比如:Vue应用实例,Vue的组件概念,模板语言和模板语法,计算属性,路由配置等等。 文章目录 本系列前文传送门前言一、Vue实例:项目入口二、模板语…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
