高阶数据结构[3]图的遍历

news2024/11/25 2:54:46

图的两种遍历

前言

1.图的遍历

2.图的广度优先遍历

3.图的深度优先遍历

 4.总结


 

前言

书接上回,这篇文章将在图的存储结构上学习图的遍历方法。

图的遍历分为两种:1.BFS(Breadth First Search)宽度优先搜索

                                 2.DFS(Depth First Search)深度优先搜索

下面让我们一起来学习吧! 注意,接下来的讲解基于图的邻接矩阵存储结构。

1.图的遍历

首先我们来了解什么叫做图的遍历,其实图的遍历也是将图的每一个结点进行访问。

 

上面这道经典的面试题就是有关图的遍历。

2.图的广度优先遍历

图的广度优先遍历,是指将同这个结点一层的结点优先遍历完全。 

这样一说大家是否想起来在二叉树遍历中的层序遍历呢! 实际上,在广度优先遍历中确实能够使用层序遍历的思想进行算法的实现。

如下图,三个抽屉,我们在进行广度优先遍历时,三个抽屉的最外层为同一层,以此类推。

所以在进行广度优先遍历时,我们先走完三个抽屉的最外层再走中间最后走最下面的

 我们用图来直观感受:

下面我们上代码,对照代码和上面的图我们可以看到,A先入队列,此后A出的时候带入与其相连的B,C,D。这时levelsize更新为3。B再出队列,B出的时候带入与B相连且未入队列的E。B出完,出C,同理带入F。以此类推就可以将上述图像进行广度优先遍历。

	void BFS(const V& src)
		{
			size_t scri = GetVertexIndex(src);
			//使用可变数组和队列进行标记
			queue<int>q;//记载已经遍历的点的下标,遍历过的点入队列.已经遍历的点从队列出来,与其相连的点入队列
			vector<bool>visited(_vertex.size(), false);//标记,来记载哪些顶点已经遍历,false为未遍历,遍历后该处改为true
			q.push(srci);//将遍历的点压入队列
			visited[srci] = true;
			int levelSize = 1;//BFS使用二叉树中层序遍历的思想
			size_t n = _vertexs.size();//_vertex存的是顶点值,即大小
			while (!q.empty())//队列不为空则要出顶点再带入相邻的顶点
			{
				//一层一层的出
				for (int j = 0; j < levelSize; j++)
				{
					int fornt = q.front();//记录队列顶的值
					q.pop();
					cout << fornt << ":" << _vertex[front] << " ";
					for (size_t i = 0; i < n; i++)//将同一层的点压入队列
					{
						if (_martix[front][i] != MAX_W)//说明二者相邻
						{
							if (visited[i] == false)//false则未访问过
							{
								q.push(i);//未访问的下标压入队列
								visited[i] = true;//该点访问过
							}
						}
					}
				}
				cout << endl;
              levelSize = q.size();
			}
			cout << endl;
		}

下面我们使用非层序的方法进行广度优先遍历的实现。这种方法实际上就是每一层基于矩阵的特性,n行n列。

void BFS(const V& scr)//宽搜的普通实现方法
		{
			size_t scri = GetVertexIndex(src);//取得顶点
			//标记队列和数组
			queue<int> q;
			vector<bool>visited(_vertex.size(), false)
				q.push(srci);
			visited[srci] = true;
			size_t n = _vertex.size();
			while (!q.empty())
			{
				int front = q.front();
				q.pop();
				for (int i = 0; i < n; i++)
				{
					if (_matrix[front][i] != MAX_W)
					{
						if (visited[i] == false)
						{
							q.push(i);
							visited[i] = true;
						}
					}
				}
			}
		}

3.图的深度优先遍历

 图的深度优先遍历即从一个点出发一直找到底再返回。还是经典的抽屉。

 

进行DFS时,是先将一个抽屉从最外面找到最里面才找下一个。我们看代码。

 

void _DFS(size_t i, vector<bool>visited)
		{
		
			visited[srci] = true;
			//找与srci相邻但未访问的点进行深度遍历
			for (size_t i = 0; i < n; i++)
			{
				if (_matrix[srci][i] != MAX_W && visited[i] == false)//两个点之间有边,且未访问
				{
					_DFS(i, visited);//递归实现
				}
			}
		}

		void DFS(const V& src)
		{
			size_t srci = GetVertexIndex(scr);
			vector<bool> visited(_vertexs.size(), false);
			_DFS(srci, visited);
		}

 4.总结

以上就是对图的遍历方式的讲解,这部分会比较困难,大家耐心学习。下一章节我们将讲解最小生成树的相关问题。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1828684.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux构建本地时间同步ntp

环境介绍&#xff1a; 主机名 IP地址 系统发行版 环境 Node01 192.168.100.102 Centos 7.4 可联网、已关闭防火墙selinux Node02 192.168.100.103 Centos 7.4 已关闭防火墙selinux 1.主节点同步阿里云标准时间 在保证连接外网的情况下&#xff0c;同步阿里服务器的…

[Linux] TCP协议介绍(1): TCP协议 数据格式、可靠性的控制、标记位... 简单介绍

上一篇文章, 针对UDP协议的格式、数据等内容做了一些简单的介绍. 并且提到, 在网络协议栈TCP/IP模型的传输层中, 有两个最具代表性的协议: UDP和TCP 下面就简单介绍分析一下TCP协议 TCP协议, 完整的称呼其实叫: 传输控制协议(Transmission Control Protocol) 从名字就可以看出…

MobaXterm卡顿问题 解决方案

写在最前面&#xff0c;解决方案是&#xff1a;setting->X11->关闭Automatically start X server at MobaXterm start up 若有空&#xff0c;可以看一下下面的排障流程~ 现象描述 使用MobaXterm作为远程连接工具的时候&#xff0c;会出现很奇怪的卡顿问题。每隔几秒&…

Modbus转Profibus网关接变频器:实现工业自动化无缝连接

一、背景 在工业自动化领域&#xff0c;Modbus和Profibus是两种常见的通讯协议&#xff0c;而变频器作为控制电机转速的重要设备。为了实现不同设备之间的无缝连接和数据传输&#xff0c;现场大多数采用Modbus转Profibus网关&#xff08;XD-MDPB100&#xff09;来解决Modbus设…

linux 部署瑞数6实战(维普,药监局)sign第二部分

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx …

从业余到专业:拼多多跨境选品师的成功之路

拼多多(Pinduoduo)作为中国颇具影响力的电商平台&#xff0c;其跨境电商领域近年来发展迅猛。作为跨境选品师&#xff0c;是否可以将其作为一项副业呢?以下将探讨这个问题&#xff0c;并提供一些实用建议。 1. 跨境电商市场概述 跨境电商市场正在迅速扩展&#xff0c;尤其是在…

UI学习--分栏控制器

UI学习 分栏控制器基础概念用法 分栏控制器高级高级属性 总结 分栏控制器基础 概念 分栏控制器可以理解为一个容器&#xff0c;可以容纳多个子视图控制器&#xff0c;并通过选项卡的方式进行切换。每个选项卡都与一个特定的视图控制器相关联&#xff0c;当用户点击不同的选项…

Elasticsearch 8.1官网文档梳理 - 十一、Ingest pipelines(管道)

Ingest pipelines 管道&#xff08;Ingest pipelines&#xff09;可让让数据在写入前进行常见的转换。例如可以利用管道删除文档&#xff08;doc&#xff09;的字段、或从文本中提取数据、丰富文档&#xff08;doc&#xff09;的字段等其他操作。 管道&#xff08;Ingest pip…

2024年【广东省安全员A证第四批(主要负责人)】复审考试及广东省安全员A证第四批(主要负责人)复审模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 广东省安全员A证第四批&#xff08;主要负责人&#xff09;复审考试参考答案及广东省安全员A证第四批&#xff08;主要负责人&#xff09;考试试题解析是安全生产模拟考试一点通题库老师及广东省安全员A证第四批&…

Bytebase 2.19.0 - 支持 DynamoDB

Bytebase 2.19.0 支持 DynamoDB 支持独立的 SQL 审核工单。 支持为工单事件配置 Slack 私信通知。 file 支持 PostgreSQL 的 DML 变更事前备份。 为 SQL Server 添加 SQL 审核规则&#xff1a;禁止冗余索引。 重大变更 创建多数据库工单时&#xff0c;不同数据库会共享同…

windows权限提升-WIN提权

Windows权限提升-WIN 全平台 Windows系统内置了许多本地用户组&#xff0c;这些用户组本身都已经被赋予一些权限(permissions),它们具有管理本地计算机或访问本地资源的权限。只要用户账户加入到这些本地组内&#xff0c;这回用户账户也将具备该组所拥有的权限。 普通权限 默…

二维数组与指针【C语言】

二维数组与指针 一维数组一维数组与指针二维数组二维数组与指针总结补充判断以下方式是否正确打印二维数组一维数组 int arr[] = {11, 22, 33, 44};arr:首地址(第一个元素的地址) 一维数组与指针 int arr[] = {11, 22, 33, 44};因为,arr表示的是首地址,等价于 int* p =…

C# TextBox模糊查询及输入提示

在程序中&#xff0c;我们经常会遇到文本框中不知道输入什么内容&#xff0c;这时我们可以在文本框中显示提示词提示用户&#xff1b;或者需要查询某个内容却记不清完整信息&#xff0c;通常可以通过文本框列出与输入词相匹配的信息&#xff0c;帮助用户快速索引信息。 文本框…

【区分】累次极限与二重极限

累次极限与二重极限不要混淆&#xff0c;区分好下面5个命题

学会python——读取大文本文件(python实例六)

目录 1、认识Python 2、环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3、读取大文本文件 3.1 代码构思 3.2 代码示例 3.3 运行结果 4、总结 1、认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强…

计算机组成原理之定点乘法运算

文章目录 原码并行乘法与补码并行乘法原码算法运算规则存在的问题带符号的阵列乘法器习题原码阵列乘法器间接补码阵列乘法器直接补码阵列乘法器 补码与真值的转换 原码并行乘法与补码并行乘法 原码算法运算规则 存在的问题 理解流水式阵列乘法器&#xff08;并行乘法器&#x…

本学期嵌入式期末考试的综合项目,我是这么出题的

时间过得真快&#xff0c;临近期末&#xff0c;又到了老师出卷的时候。作为《嵌入式开发及应用》这门课的主讲教师&#xff0c;今年给学生出的题目有一点点难度&#xff0c;最后的综合项目要求如下所示&#xff0c;各位学生朋友和教师同行可以评论一下难度如何&#xff0c;单片…

CMake的使用方法

1 CMakeLists.txt编写 cmake_minimum_required(VERSION 3.12)project(djl_plm)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdc17 -g")add_executable(simple simple.cpp) add_executable(main main.cpp)include_directories(include) 相当于如下gcc命令&#xff1…

浅析MySQL-基础篇01

执行一条select语句&#xff0c;发生了什么&#xff1f; 学习SQL的时候&#xff0c;查询数据的时候简单的用到就是下面的这SQL语句&#xff1a; select * from tbl_1 where id 100; 有没有想过&#xff0c;MYSQL执行一条select查询语句&#xff0c;在MYSQL中期间发生了什么…

C/C++李峋同款跳动的爱心代码

一、写在前面 在编程的世界里&#xff0c;代码不仅仅是冷冰冰的命令&#xff0c;它也可以成为表达情感、传递浪漫的工具。今天&#xff0c;就让小编带着大家用C语言打造出李峋同款跳动的爱心吧&#xff01; 首先&#xff0c;我们需要知道C作为一种高级编程语言&#xff0c;拥…