图的遍历 ——深度优先遍历

article/2025/9/20 7:36:46

图的遍历 ——深度优先遍历

深度优先搜索(Depth First Search,DFS)是最常见的图搜索方法之一。

深度优先搜索沿着一条路径一直搜索下去,在无法搜索时,回退到刚刚访问过的节点。深度优先遍历是按照深度优先搜索的方式对图进行遍历的。

深度优先遍历的秘籍:后被访问的节点,其邻接点先被访问。

根据深度优先遍历的秘籍,后来者先服务,这可以借助于栈实现。递归本身就是使用栈实现的,因此使用递归的方法更方便。

【算法步骤】

① 初始化图中的所有节点均未被访问。

② 从图中的某个节点v 出发,访问v 并标记其已被访问。

③ 依次检查v 的所有邻接点w ,如果w 未被访问,则从w 出发进行深度优先遍历(递归调用,重复步骤2~3)。

【完美图解】

例如,一个无向图如下图所示,

在这里插入图片描述

其深度优先遍历的过程如下所述。

① 初始化所有节点均未被访问,visited[i]=false,i =1,2,…,8。

② 从节点1出发,标记其已被访问,visited[1]=true。

在这里插入图片描述

③ 从节点1出发访问邻接点2,然后从节点2出发访问节点4,从节点4出发访问节点5,从节点5出发访问未被访问的邻接点。

在这里插入图片描述

④ 回退到刚刚访问过的节点4,节点4也没有未被访问的邻接点,回退到最近访问过的节点2,从节点2出发访问下一个未被访问的邻接点6。

在这里插入图片描述

⑤ 从节点6出发访问未被访问的邻接点,回退到刚刚访问过的节点2,节点2没有未被访问的邻接点,回退到最近访问过的节点1。

在这里插入图片描述

⑥ 从节点1出发访问下一个未被访问的邻接点3,从节点3出发访问节点7,从节点7出发访问节点8,从节点8出发访问未被访问的邻接点。

在这里插入图片描述

⑦ 回退到刚刚访问过的节点7,节点7也没有未被访问的邻接点,回退到最近访问过的节点3,节点3也没有未被访问的邻接点,回退到最近访问过的节点1,节点1也没有未被访问的邻接点,遍历结束。访问路径如下图所示。

在这里插入图片描述

∴ 深度优先遍历序列为1 2 4 5 6 3 7 8。

深度优先遍历经过的节点及边被称为深度优先生成树,如下图所示。

在这里插入图片描述

如果深度优先遍历非连通图,则每一个连通分量都会产生一棵深度优先生成树。

【算法实现】

① 基于邻接矩阵的深度优先遍历

void DFS_AM(AMGragh G , int v){ //基于邻接矩阵的深度优先遍历cout << G.Vex[v] << "\t";visited[v] = true;for(int w = 0 ; w < G.vexnum ; w++){ //依次检查v 的所有邻接点if(G.Edge[v][w] && visited[w]){ //v、w 邻接并且w 未被访问DFS_AM(G , w); //从节点w 出发,递归深度优先遍历}}
}

② 基于邻接表的深度优先遍历

void DFS_AL(ALGragh G , int v){ //基于邻接表的深度优先遍历AdjNode *p;cout << G.Vex[v].data << "\t";visited[v] = true;p = G.Vex[v].first;while(p){ //依次检查v 的所有邻接点int w = p->v; //w 为 v 的邻接点if(!visited[w]){ //w未被访问DFS_AL(G , w); //从w 出发,递归深度优先遍历}p = p->next;}
}

③ 基于非连通图的深度优先遍历

void DFS_AL(ALGragh G){ //非连通图,基于邻接表的深度优先遍历for(int i = 0 ; i < G.vexnum ; i++){ //对非连通图需要查漏点,检查未被访问的节点if(!visited[i]){ //i 未被访问,以i 为起点再次广度优先遍历DFS_AL(G , i); //基于邻接表,也可以替换为基于邻接矩阵DFS_AM(G , i);}}
}

【算法分析】

深度优先遍历的过程实质上是对每个节点都搜索其邻接点的过程,图的存储方式不同,其算法复杂度也不同。

① 基于邻接矩阵的深度优先遍历算法。查找每个节点的邻接点需要O (n )时间,共n 个节点,总的时间复杂度为O (n^2 )。这里使用了一个递归工作栈,空间复杂度为O (n )

② 基于邻接表的深度优先遍历算法。查找节点vi 的邻接点需要O (d (vi ))时间,d (vi )为vi 的出度,对有向图而言,所有节点的出度之和等于边数e ;对无向图而言,所有节点的度之和等于2e ,因此查找邻接点的时间复杂度为O (e ),加上初始化时间O (n ),总的时间复杂度为O (n +e )。这里使用了一个递归工作栈,空间复杂度为O (n)。

需要注意的是,一个图的邻接矩阵是唯一的,因此基于邻接矩阵的广度优先级遍历或深度优先遍历的序列也是唯一的,而图的邻接表不是唯一的,边的输入顺序不同,正序或逆序建表都会影响邻接表中的邻接点顺序,因此基于邻接表的广度优先遍历或深度优先遍历的序列不是唯一的。


http://chatgpt.dhexx.cn/article/RH8dxMTP.shtml

相关文章

二、图的遍历——深度优先遍历

深度优先遍历&#xff0c;也有称为深度优先搜索&#xff0c;简称为DFS。 深度优先遍历其实就是一个递归的过程&#xff0c;它从图中某个顶点ⅴ出发&#xff0c;访问此顶点&#xff0c;然后从V的未被访问的邻接点出发深度优先遍历图&#xff0c;直至图中所有和V有路径相通的顶点…

图的遍历(深度优先遍历DFS,广度优先遍历BFS)以及C语言的实现

遍历的定义&#xff1a; 从已给的连通图中某一顶点出发&#xff0c;沿着一些边访遍图中所有的顶点&#xff0c;且使每个顶点仅被访问一次&#xff0c;就叫做图的遍历&#xff0c;它是图的基本运算&#xff0e; 一:深度优先遍历&#xff08;&#xff24;&#xff26;&#xff…

使用SSM框架上传图片

使用SSM框架上传图片 为了大家方便对照,我上传源码到网盘,有兴趣的自取. ps:其中有一个存储数据的网页,我没删除,可以忽略 链接&#xff1a;https://pan.baidu.com/s/1u24E8mUs4K-raoQgx-ae2A 提取码&#xff1a;java 建数据表 CREATE DATABASE my_resource;USE my_resource…

SSM框架简单介绍

一. SSM框架简介及特征 1.SpringMVC Spring MVC属于SpringFrameWork的后续产品&#xff0c;已经融合在Spring Web Flow 里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构&#xff0c;从而在使用Spring进行WEB开发时&#xff0c;可…

SSM框架整合详细教程

目录 1. 什么是SSM&#xff1f; 2. SSM整合的时候容器之间如何访问 3. SSM下面的开发步骤 4. SSM整合时候时容易混乱的知识点 1. 什么是SSM&#xff1f; SSM是对三个框架名字的简写&#xff0c;其中第一个S指的是SpringMVC,第二个S指的是Spring&#xff0c;第三个M指的是M…

SSM框架理解

一、作用&#xff1a; 1、 SSM是spingspringMVCmybatis集成的框架。是标准的MVC模式&#xff0c;将整个系统划分为表现层&#xff0c;controller层&#xff0c;service层&#xff0c;DAO层四层。 2、使用spring MVC负责请求的转发和视图管理&#xff0c;spring实现业务对象管理…

SSM框架初探

SSM 框架初探 SSM框架简介对框架的理解为什么使用 SSM 框架 SpringSpringMVCMybatis SSM框架简介 SSM框架一种以java语言作为后端搭建基本语言的应用系统搭建框架。是继SSH(strutsspringhibernate)之后&#xff0c;目前较为主流的Java EE企业级框架&#xff0c;适用于搭建各种大…

SSM框架整合

今天来整合一下SSM三大框架~~ 1、创建一个maven项目 比较简单就不赘述了&#xff0c;创建的时候选择webapp骨架。 用骨架创建的项目&#xff0c;在创建完之后要更新一下web.xml 模板目录&#xff1a;“你的Tomcat安装目录\webapps\ROOT\WEB-INF\web.xml” 2、项目整体结构 按…

SSM框架原理

SSM框架是spring MVC &#xff0c;spring和mybatis框架的整合&#xff0c;是标准的MVC模式&#xff0c;将整个系统划分为表现层&#xff0c;controller层&#xff0c;service层&#xff0c;DAO层四层 使用spring MVC负责请求的转发和视图管理 spring实现业务对象管理&#xff…

SSM框架总结

一&#xff1a;什么是SSM框架&#xff1f; SSM框架是Spring、SpringMVC和MyBatis框架的总结&#xff0c;是比较标准的MVC模式。 标注的SSM框架有四层&#xff1a;dao&#xff08;mapper&#xff09;层、service层、controller层、domain(entity)层。 使用Spring实现业务对象…

SSM框架详解

SSM框架详解 写在前面&#xff1a;当初整理SSM原理时&#xff0c;参考了网上一些前辈的文章&#xff0c;时间久远已经忘记来源&#xff0c;所以文中原理部分如有侵权请联系我删除。 基于SSM框架的仿天猫商城网站电商后台管理系统 本文视频讲解 文章目录 SSM框架详解 一、项…

java ssm框架论文,ssm框架理解

文章简介: SSM框架集简介 spring框架IOC的理解 mybatis框架sqlSessionFactory理解 Tomcat的理解 图解SSM SSM框架常用注解 1.SSM框架集简介 SSM(Spring+SpringMVC+MyBatis)框架集由Spring、MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容)。常作为数据源较简单的…

SSM框架详细讲解

SSM框架 文章目录 SSM框架&#xff08;白痴都看完都会&#xff09;介绍SSM框架<原理>一、什么是SSM框架&#xff1f; 1.Spring2.Spring MVC3.Mybatis &#xff08;核心是SqlSession&#xff09;二、代码实战 1.创建配置工程2.代码实战&#xff08;查询记录数&#xff0…

SSM三大框架超详细总结(适合你重新回顾)

目录 1.1 概念 1.2 Mybatis优点 1.3 Mybatis架构 1.4 底层原理 1.5 Mybatis缓存 1.6 常见面试题 2.1 概念 2.2 Spring优点 2.3 Spring架构 2.4 控制反转&#xff08;IOC&#xff09; 2.5 DI依赖注入 2.6 底层原理(常见面试题) 8、如何用基于 Java 配置的方式配置 Spring&#…

SSM框架整合思想及步骤

前言 SSM框架即是将SpringMVC框架、Spring框架、MyBatis框架整合使用。以简化在web开发中繁琐、重复的操作&#xff0c;让开发人员的精力专注于业务处理的开发上。 一、SSM框架的思想 ssm框架根据SpringMVC、Spring、MyBatis三者各自的特性及应用场景对其操作的的业务进行了分…

SSM框架简介

一、Java SSM框架的概念 Java SSM框架即指SpringSpringMVCMyBatis的简称&#xff0c;框架集由Spring、MyBatis两个开源框架整合而成&#xff08;SpringMVC是Spring中的部分内容&#xff09;,常作为数据源较简单的web项目的框架。 相比于之前的SSH&#xff08;SpringStrutsHibe…

SSM框架讲解(史上最详细的文章)

SSM框架&#xff08;白痴都看完都会&#xff09; 文章目录 SSM框架&#xff08;白痴都看完都会&#xff09;介绍SSM框架<原理>一、什么是SSM框架&#xff1f;1.Spring2.Spring MVC3.Mybatis &#xff08;核心是SqlSession&#xff09; 二、代码实战1.创建配置工程2.代码实…

MySQL安装教程(超详细教程)

MySQL详细安装步骤 - windows(MySQL Installer for Windows)附链接 1.下载所需要的版本(可自选&#xff0c;5.7.29为稳定版本)下载链接&#xff0c;运行程序 2.个人学习使用server only&#xff0c;如果不确定需求&#xff0c;则选择full&#xff0c;全部安装&#xff1b;Next …

Mysql详细安装教程

&#x1f973;&#x1f973;&#x1f973; 茫茫人海千千万万&#xff0c;感谢这一刻你看到了我的文章&#xff0c;感谢观赏 &#x1f60f;。 &#x1f449; 作者简介&#xff1a;最爱吃鱼罐头。(抱歉&#xff0c;我真的吃鱼罐头&#x1f92b;) &#x1f97a; 本人不才&#xff…

【MySQL】免安装版MySQL安装教程

前言 近日&#xff0c;重新安装了一下本地的数据库&#xff0c;参考了很多博客才将MySQL给安装好&#xff0c;为了方便以后安装&#xff0c;便结合了网上博客的安装方法以及自己的一些经验写下这篇博客&#xff0c;也希望能给你们带来帮助。 一、MySQL是什么&#xff1f; My…