图遍历之深度优先搜索

数据结构第五章图的知识点归纳总结(偏个人的总结 ……未完待续) 5.1 图的基本概念 1.在无向图中,若任意两个顶点之间都存在边,则称该图为无向完全图。含有n个顶点的无向完全图有n(n-1)/2条边。 2.在有向图中,若任意两个顶点之间都存在方向相反的两条弧,则称该图为有向完全图。含有n个顶点的有向完全图有n(n-1)边 赶紧做两道题来消化知识点! (1)若无向图G=(V,E)中含有7个顶点,要保证图G在任何情况下都是连通的,则需要的边数最少是()? 答案:16 解析:要保证在任何情况下都连通,6个顶点的完全无向图,有15条边,此时我随便加一个顶点进去,无论 阅读详情

一 概述

深度优先搜索(Depth-First-Search,DFS)类似于树的先序遍历。它遵循的搜索策略是尽可能"深"地搜索一个图。

二 深度优先搜索的基本思想

  1. 首先访问图中某一起始顶点v;
  2. 接着由顶点v出发,访问与v邻接且未被访问的任意顶点Wi;
  3. 然后访问与Wi邻接且未被访问的任一顶点Yi;
  4. 若Wi没有邻接且未被访问的顶时,退回到它的上一层顶点v;
  5. 继续重复上述过程。当不能再继续向下访问时,依次退回到最近被访问的顶点,若它还有邻接顶点未被访问过,则从该点开始继续上述搜索过程,直至图中所有顶点均被访问过为止。

上述过程中涉及到了递归,即DFS算法是一个递归算法,需要借助一个递归工作栈,故其空间复杂度为O(|V|)。

三 深度优先搜索算法的实际案例步骤分析

如图所示,深度优先访问的步骤为:

先访问起始顶点1。

接着从顶点1出发,访问与顶点1邻接且未被访问的任意顶点2或3,此处先访问顶点2。

然后访问与顶点2相邻且未被访问的顶点4或5,此处访问顶点4。

访问顶点4之后,对其邻接顶点5进行访问。

当访问与顶点5相邻且未被访问的顶点时,发现顶点不存在,所以依次退回最近访问的顶点,当退至顶点4,返现未被访问的顶点7,并进行访问。

访问与顶点4相邻且未被访问的另一个顶点7。

当访问与顶点7相邻且未被访问的顶点时,发现顶点不存在,所以依次退回最近访问的顶点,当退至顶点1时,返现未被访问的顶点3,并进行访问。

最后访问顶点与顶点3相邻且未被访问的顶点6,这样就完成了该图的深度优先算法的操作。

四 深度优先搜索算法的实现

根据上述实例分析可知,图的深度优先搜索算法的实现类似于树的先序优先遍历算法。由此,图的深度优先搜索算法可以利用递归方法来实现,所以我们需要利用栈来完成递归操作的实现。同时利用一个辅助标记数组对已经访问的顶点进行标记。

bool visited[MAX_TREE_SIZE]
//对非连通图进行各个顶点访问
void DFSTraverse(Graph G){
	//初始化visited数组
	for(int i = 0; i < G.vexnum; ++i){
		visited[i] = FALSE;
	}
	//实现非连通图的广度优先搜索的一个循环
	for(int i = 0; i < G.vexnum; ++i){
		if(!visited[i]){
			DFS(G,i);
		}
	}
}
 
//G表示连通图,v表示搜索顶点的编号
void DFS(Graph G,int v){
	//访问顶点
	visit(v);
	//将改顶点在辅助标记数组中的值设置为TRUE
	visited[v] = TRUE;
	//找到所有符合要求的邻接顶点
	//FirstNeighbor求某个顶点的第一个邻接顶点,当此时的w为-1表示无邻接顶点,当w>0成立时,该w为邻接顶点的编号
	//NextNeighbor求某个顶点的其他邻接顶点。
	for(w = FirstNeighbor(G,v); w >= 0; w = NextNeighbor(G,v,w))
		if(!visited[w]){
			DFS(G,w);
	}//if
}

对于通过邻接矩阵构造的图中DFS(BFS)序列均是唯一的,而通过邻接表构造的图DFS(BFS)序列是不唯一。

五 DFS算法的性能分析

DFS算法的空间复杂度:因为最坏情况下,利用的空间栈大小为结点的数量,故该算法的空间复杂度为O(|V|)。

DFS算法的时间复杂度:

通过邻接矩阵法的图:

DFS的时间复杂度为O(|V|*|V|)。

原因:我们在DFS中访问某个顶点时,我们需要一个循环来寻找某个顶点的所有邻接顶点,在邻接矩阵法中找寻某顶点的所有邻接顶点即为找到该顶点在矩阵中对应的行。当矩阵中某值为1的时候,该值对应的顶点即为要寻找的邻接顶点。当在邻接矩阵法的图中通过DFS算法找到所有顶点的邻接顶点的时间复杂度为O(|V| * |V|)。

通过邻接表法的图:

DFS的时间复杂度为O(|V| + |E|)。

原因:我们在访问所有顶点的邻接顶点时,需要通过访问其边进行访问。所以当在邻接表法的图中通过DFS算法找到所有顶点的邻接顶点的时间复杂度为O(|V| + |E|)。

百度2020校招C++/PHP研发工程师笔试卷(第一批) 下列关于图的说法正确的是(B)A线性表可以是空表,树可以是空树,图可以是空图;B某有向完全图含有含有20条边,则该有向完全图具有5个顶点;C极大联通子图要求保持图的联通性,还要求子图的边数最少;D强连通分量仅针对无向图而言,对于有向图仅讨论图的连通性;2.下列关于某无向图的说法中,错误的是(C)A若该图具有1024条边,且每个顶点的度数均为2,则其必有1024个顶点;B若该图具有1024条边,且该图具有1024个顶点,则该图中必定存在环;C。 阅读详情

相关推荐

41、图遍历:深度优先搜索及其应用

本博文深入探讨了深度优先搜索(DFS)在图遍历中的核心应用,包括DFS编号与完成时间的标记机制、拓扑排序的实现、以及强连通分量(SCC)的高效计算方法。文章还介绍了如何通过DFS检测图中的环结构,并基于DFS的特性实现边类型分类和拓扑排序。此外,博文详细解析了强连通分量的不变性质与缩图概念,并提供了一种线性时间复杂度的SCC计算算法。通过丰富的引理证明、伪代码描述和练习题思路探讨,读者可以全面掌握DFS在图论中的关键作用及其实际应用价值。

egg99的博客 88

第六章 图

王道第六章图 的课后题

m0_64583811的博客 1269

从零上手:基于RK3588平台的RKISP Tuner实战配置与核心功能解析

本文详细介绍了在RK3588平台上使用RKISP Tuner工具进行图像信号处理器(ISP)调试的完整实战流程。从MATLAB运行时环境搭建、服务端部署到核心连接,逐步解析如何通过图形化界面实时调节白平衡、锐化、降噪等参数以优化图像质量。文章重点阐述了实时预览、参数调试、抓图对比及参数保存等核心功能,为开发智能摄像头、机器人等AIoT设备的工程师提供了实用的配置指南与进阶技巧。

js777的博客 632

【数据结构笔记】5.图

图的顶点集V一定非空,但边集可以E为空。

江城暮色 1321

手把手讲解RTX5操作系统在GD32F407上的移植

然后将GD32F4xx_Demo_Suites_V2.6.4\GD32407V_START_Demo_Suites\Projects\01_GPIO_Running_LED下面的main函数复制到我们的项目文件夹中;打开对应GD32407V_START_Demo_Suites的文件夹下面的Utilities,复制gd32f407v_start.c和gd32f407v_start.h文件到一开始项目保存的文件夹下面;为了验证我们的操作系统是否被正确添加,是否能够正确运行,我们需要添加示例文件;

Praguejing的博客 1865

Cursor Pro版保姆级开通教程:绕过7天试用,支付宝一步搞定(附地区报错解决方案)

本文详细介绍了Cursor Pro版的订阅流程,包括支付宝支付步骤和解决区域报错的实用方案。针对开发者常见的网络问题和云服务器配置需求,提供了从本地环境调整到云端部署的完整指南,帮助用户高效解锁Pro版的代码补全、私有代码库等核心功能。

weixin_28710999的博客 2112

如何对无环有向图中的顶点号重新安排使得该图的邻接矩阵中所有的1都集中到对角线以上?

如何对无环有向图中的顶点号重新安排使得该图的邻接矩阵中所有的1都集中到对角线以上? 有两种方法,如下: 方法一: 1>将顶点号的出度根据大小进行排序,出度最大的顶点编号为1,依次到出度最小的顶点编号为n。 2>调整,只要存在弧<i,j>,无论两个顶点出度的大小,都要使顶点i的序号在顶点j的序号前,(i<j)。 方法二: 采用拓扑排序对顶点号重新安排。 ...

black_procedure的博客 3565

飞塔防火墙认证绕过漏洞(CVE-2022-40684)深度剖析与实战复现

本文深度剖析了Fortinet飞塔防火墙高危认证绕过漏洞CVE-2022-40684的原理与影响。该漏洞允许攻击者通过构造包含特定Forwarded头和User-Agent的HTTP请求,无需凭证即可绕过认证,以管理员身份访问设备。文章详细演示了从环境搭建到实战复现,最终植入SSH密钥获取控制权的完整过程,并提供了漏洞挖掘技巧与关键防御建议。

d6e7f8g9h的博客 709

DS图遍历--深度优先搜索

DS图遍历–深度优先搜索 题目描述 给出一个图的邻接矩阵,对图进行深度优先搜索,从顶点0开始 注意:图n个顶点编号从0到n-1 代码框架如下: 输入 第一行输入t,表示有t个测试实例 第二行输入n,表示第1个图有n个结点 第三行起,每行输入邻接矩阵的一行,以此类推输入n行 第i个结点与其他结点如果相连则为1,无连接则为0,数据之间用空格隔开 以此类推输入下一个示例 输出 每行输出一个图的深度优...

luoyeliufeng的博客 674

ATR2660:卫星导航高增益低噪声放大器芯片数据手册

中国BDS(北斗卫星导航系统),美国的GPS,俄罗斯的GLONASS和欧盟的GALILEO导航系统应用而专门设计。芯片支持3.3V至5V宽电源供电。采用2级放大器的结构设计,具有28dB高增益和0.85dB的低噪声系数。支持BDS、GPS、GALILEO、GLONASS等L。典型功率增益:30dB@5V;典型输入P1dB:-18dBm@3.3V;典型工作电流:12.7mA@3.3V;宽供电电压范围:3.3V~5V;典型噪声系数:0.85dB;频段的多个卫星导航系统;ATR2660是一颗。

YHPsophie的博客 562

lidar360 V8.0 & lidar360MLS V8.0雷达点云数据处理软件

机载林业 — 基于机载激光雷达点云数据提取一系列森林结构参数(如:高度分位数、叶面积指数、郁闭度等),分割单木并提取单木参数(包括树的位置、树高、胸径、枝下高、冠幅等属性),利用软件的多种回归分析功能可以结合地面调查数据反演森林生物量、蓄积量等功能参数。还可以生成等高线、山体阴影、坡度、坡向、粗糙度等多种产品。分类 — LiDAR360提供多种分类功能,包括地面点分类、模型关键点分类、选择区域地面点分类、机器学习模型分类(可高效地分离建筑、植被、路灯等通用类别)、深度学习模型分类、自定义深度学习分类等。

2403_83796253的博客 5156

【数据结构与算法】图遍历算法 ( 深度优先搜索 DFS | 深度优先搜索和广度优先搜索 | 深度优先搜索基本思想 | 深度优先搜索算法步骤 | 深度优先搜索理论示例 )

一、深度优先搜索 DFS 1、深度优先搜索和广度优先搜索 2、深度优先搜索基本思想 3、深度优先搜索算法步骤 二、深度优先搜索示例 ( 理论 ) 1、第一轮递归 2、第二轮递归 3、第三轮递归 4、第四轮递归 5、第五轮递归 6、第六轮递归 7、第七轮递归

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 9308

智能车学习日记【二】————十字和斜入十字

智能车学习日记【二】————十字和斜入十字 文章目录 智能车学习日记【二】————十字和斜入十字 前言 一、普通十字补线 二、斜入十字 1.判断是否为斜入十字和斜入十字类型 2.找斜入十字拐点 总结 前言 经过了一个多月的学习,小白的我终于也是能较稳定调出了2.8m以上的四轮车,过程中也遇到了很多困难,其中就有十字补线和斜入十字补线。尤其是斜入十字也是困扰了我快一周,现在和大家分享一下我处理斜入十字的方法(我的方法其实还有很多漏洞需要改进,仅供大家参考理解一下,欢迎各位在评论区指点出可

bsefef的博客 2743

【C语言图遍历核心技巧】:掌握深度优先搜索的5大关键步骤

掌握C语言实现图的深度优先搜索,快速解决图遍历难题。涵盖邻接表构建、递归与栈实现、访问标记等五大关键步骤,适用于路径查找与连通性分析,高效且易于理解,值得收藏。

PixelFlow的博客 987

Open3D 模拟退火算法优化的ICP点云配准

传统ICP算法易陷入局部最优且对初始位姿敏感,而SA算法通过概率性接受劣解,能够在高温阶段广泛探索解空间,低温阶段精细收敛。

点云侠的博客 244

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

DS图遍历–深度优先搜索

DS图遍历–深度优先搜索 题目 给出一个图的邻接矩阵,对图进行深度优先搜索,从顶点0开始 注意:图n个顶点编号从0到n-1 代码框架如下: 输入 第一行输入t,表示有t个测试实例 第二行输入n,表示第1个图有n个结点 第三行起,每行输入邻接矩阵的一行,以此类推输入n行 第i个结点与其他结点如果相连则为1,无连接则为0,数据之间用空格隔开 以此类推输入下一个示例 输出 每行输出一个图的深度优先搜索结果,结点编号之间用空格隔开 样例输入 2 4 0 0 1 1 0 0 1 1 1 1 0 1 1 1 1 0

NP_hard的博客 842

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

深度优先搜索(Depth First Search, DFS)是一种常见的图遍历算法,采用栈的结构实现

深度优先搜索(Depth First Search, DFS)是一种常见的图遍历算法,采用栈的结构实现,其基本思想是从图的某个顶点开始遍历,沿着一条路径遍历到底,直到不能再继续下去,然后回溯到前一级节点,寻找下一个可遍历的路径,再沿着该路径遍历下去。我们将所要解答的问题划分成若干个阶段或者步骤,当一个阶段计算完毕,下面往往有多种可选选择,所有的选择共同组成了问题的解空间,对搜索算法而言,将所有的阶段或步骤画出来就类似是树的结构(如图)。产生新的状态的过程叫扩展(由一个状态,应用规则,产生新状态的过程)

[Blog][Domain] programb.blog.youkuaiyun.com 607

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

基于深度优先搜索的图遍历

和无向图遍历一样,建立邻接矩阵即可。

博客简介 543
上一篇: 图遍历之广度优先搜索
下一篇: 行列式基本性质汇总
至学者
博客等级 码龄9年 180粉丝 773原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值