【图】DFS、BFS遍历

news2025/1/23 21:28:04

图有两种遍历方式:DFS深度优先,BFS广度优先

把所有顶点访问一遍,且每个顶点只访问一次,把走过的顶点标记一下。

标记:为图设置一个访问标志数组visited[n],用于标示图中每个顶点是否被访问过,它的初始值为0(),表示顶点均未被访问;一旦访问过顶点vi,则置访问标志数组中的visited[i]1(“真”),以表示该顶点已访问。

深度优先遍历:顺着一条路走,若走到相邻的顶点都遍历过了——回溯看上一个顶点是否还有未访问的邻接顶点。

图1 图的深度优先遍历 

 广度优先遍历:从一个顶点开始走,先走完它所有的邻接顶点,然后再走其邻接顶点的邻接顶点(与树的层遍历相似)。

 图2 图的广度优先遍历


BFS广度优先

        广度优先跟树的层遍历相似,都要用到队列。

void GraphLink::BFS(char v)//广度优先
{
	int p = GetVertexIndex(v);//获取改顶点的下标
	if (p == -1)return;
	bool* visited = new bool[m_NumVertex];//标记每个点是否访问
	for (int i = 0; i < m_NumVertex; i++)//一开始都置为假-没有被访问过
		visited[i] = false;

	queue<char> qq;
	qq.push(p);//入队
	visited[p] = true;//被访问-真
	cout << v << " ";//输出
	int front;
	Edge* plist = nullptr;
	while (!qq.empty())
	{
		front = qq.front();//得到队头(下标)
		qq.pop();//出队
		plist = m_VerArr[front].m_list;//指向那个头的list(邻接顶点链表)
		while (plist != nullptr)//有邻接顶点
		{
			if (!visited[plist->m_destindex])//没被访问过
			{
				cout << m_VerArr[plist->m_destindex].m_VerValue << " ";//输出
				visited[plist->m_destindex] = true;//访问了
				qq.push(plist->m_destindex);//放到队列里
			}
			plist = plist->m_next;//指向下一个邻接顶点下标
		}
	}
	cout << endl;
    delete[]visited;
	visited = nullptr;
}

 建立这样的图

 广度优先:


 DFS深度优先 

        深度优先会使用递归和回溯,但是是否被访问visited数组应该是同一的,不因递归重置,所以深度优先可以写两个函数,一个创建visited,然后把数组传入另一个函数。

void GraphLink::DFS(int v, bool* visited)
{
	cout << m_VerArr[v].m_VerValue << " ";//遍历到
	visited[v]=true;//置为真
	Edge* plist = m_VerArr[v].m_list;//指向其邻接顶点链表
	while (plist != nullptr)
	{
		if (!visited[plist->m_destindex])//没有被访问过
		{
			DFS(plist->m_destindex, visited);//继续深度优先
		}//都访问了,回溯
		plist = plist->m_next;指向下一个邻接顶点
	}
}
void GraphLink::DFS(char v)//深度优先
{
	int p = GetVertexIndex(v);
	if (p == -1)return;
	bool* visited = new bool[m_NumVertex];
	for (int i = 0; i < m_NumVertex; i++)
		visited[i] = false;
	DFS(p, visited);//visited不能递归
	delete[] visited;
	visited = nullptr;
}

以上图用邻接表表示,邻接表创建方法见:

【图】邻接表_曦樂~的博客-CSDN博客 

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

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

相关文章

C++引用()笔记

C引用(&)笔记 1.寄存器一般只有4/8个字节&#xff0c;所以返回时候的中间变量(下图的临时变量)不一定是储存在寄存器当中 2.传引用返回可以减少拷贝&#xff0c;增加效率 但运行打印会出错的&#xff0c;因为当栈帧销毁的时候&#xff0c;清理栈帧就会得到随机值 正确表达…

西宾蜻蜓FM语音下载(qingtingdown)

一、介绍 西宾蜻蜓FM语音下载&#xff08;qingtingdown&#xff09;&#xff0c;能够帮助你下载蜻蜓FM音频节目。如果你是蜻蜓FM会员&#xff0c;它还能帮你下载会员节目。 二、下载地址 本站下载&#xff1a;西宾蜻蜓FM语音下载&#xff08;qingtingdown&#xff09; 百度…

PSP - AlphaFold2 适配不同来源搜索的 MSA 接口

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/130594303 MSA (Multiple Sequence Alignment) 在 AlphaFold2 中的工作方式如下: 使用搜索工具 (hhblits/hhsearch/jackhmmer),从大型数据库中,搜索与目标…

从零开始学习JVM(二)--类加载子系统

1. 类加载子系统介绍 JVM内存结构如下图所示&#xff1a; 程序计数器&#xff08;PC寄存器&#xff09;&#xff1a;程序计数器是⼀块⼩的内存空间&#xff0c;可以看作是当前线程所执⾏的字节码的⾏号指示器。字节码解释器⼯作时通过改变这个计数器的值来选取下⼀条需要执⾏…

PyTorch读取数据集全部进内存,使网络的训练速度提高10倍以上!!!

正常情况下&#xff0c;torch读取数据的时候是Batch Size小批量读取。首先找到所有数据集的路径保持到一个变量中&#xff0c;之后需要读取哪个数据的时候&#xff0c;就根据这个变量中的路径索引去读取。因为硬件的限制&#xff0c;从硬盘中读取数据到显存中所花的时间要远远大…

计算机体系结构实验一

计算机体系结构实验一 一.实验目的 ​理解RISC-V的指令执行的数据流和控制信号&#xff0c;熟悉指令流水线的工作过程。 二.实验过程 1.RISC-V的相关指令 实验的模拟器使用RISC-V指令集&#xff0c;为了便于后续分析&#xff0c;首先学习实验中使用的RISC-V指令。 基本RIS…

Cesium最新版使用天地图地形及注记服务

天地图三维地名服务和地形服务需要利用 cesium 开源三维地球API与天地图扩展插件共同使用&#xff0c;目前支持cesuim1.52、1.58、1.63.1。 天地图调用demo: http://lbs.tianditu.gov.cn/docs/#/sanwei/ 注意&#xff1a; demo里的地形服务地址不对&#xff0c;需要自己更换成…

MCU通用移植方案

MCU通用移植方案 目录 MCU通用移植方案前言1 硬件移植2 软件移植2.1 底层移植方法2.1.1 移植原理2.1.2 移植方法 2.2 中间层移植方法2.2.1 移植原理2.2.2 移植方法 2.3 两种移植方法比对 3 结束语 前言 因为项目的需求或者成本控制等因素&#xff0c;我们经常会遇到更换MCU的情…

华硕 PRIME H610M-A D4 i5-12490F 1060电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板华硕 PRIME H610M-A D4&#xff08;LPC Controller/eSPI Controller H610芯片组&#xff09; 处理器12th Gen Intel Core i5-12490F 六核已驱动 内…

Mysql的重要知识点以及问题

查看索引的命令 show index from mytable 索引的原理 索引用来快速地寻找那些具有特定值的记录。如果没有索引&#xff0c;⼀般来说执行查询时遍历整张表。 索引的原理&#xff1a;就是把无序的数据变成有序的查询 把创建了索引的列的内容进行排序 对排序结果生成倒排表…

货运物流小程序开发功能有哪些?

移动互联网的深入发展让网购等线上交易更加盛行&#xff0c;货运快递物流也随之增多&#xff0c;成为我们日常生活的重要组成部分。传统的货运物流管理主要依赖人工&#xff0c;不仅效率慢还容易出错。随着市场的发展以及人们对服务质量要求的提高&#xff0c;现在很多中大型货…

Oracle 12c安装

前言 版本&#xff1a;12c第二版 检查弹出窗口程序&#xff0c;需要安装xmanager,并执行以下命令&#xff1a; xhost 192.168.194.91 安装步骤如下 安装必须的安装包&#xff1a; rpm -q bc binutils compat-libcap1 compat-libstdc-33 glibc glibc-devel ksh libaio libaio…

c++ 多态与虚函数

c中多态分为静态多态和动态多态&#xff0c;静态多态是函数重载&#xff0c;在编译阶段就能确定调用哪个函数。动态多态是由继承产生的&#xff0c;指不同的对象根据所接收的消息(成员函数)做出不同的反应。例如&#xff0c;动物都能发出叫声&#xff0c;但不同的动物能发出不同…

esp32之解析json

文章目录 前言一、json的作用二、json结构三、esp32 json解析安装库解析StaticJsonDocumentDynamicJsonDocument 四、解析今天的北京天气总结 前言 在现代Web开发中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;已成为常用的数据传输格式。ESP32是一款…

Netty 爱好者必看!一文详解 ChannelHandler 家族,助你快速掌握 Netty 开发技巧!

1 Channel 接口的生命周期 Channel 定义了一组和 ChannelInboundHandler API 密切相关的简单但功能强大的状态模型 1.1 Channel 的状态 状 态描 述ChannelUnregisteredChannel 已经被创建&#xff0c;但还未注册到 EventLoopChannelRegisteredChannel 已经被注册到了 EventL…

Wealth 开源的账本响应式网站系统免费部署

演示网站&#xff1a; https://wealth.willin.wang 前置准备 首先需要注册一个 Github 账号&#xff0c;Fork 这个开源项目&#xff1a; https://github.com/willin/wealth &#xff08;欢迎 Star&#xff09; 然后使用 Github 账号分别注册 Vercel 和 Planetscale&#xf…

【Linux 】 ps命令详解,查看进程pid

文章目录 ps概述ps语法指定pid进行查看 ps概述 ps 命令是最常用的监控进程的命令&#xff0c;通过此命令可以查看系统中所有运行进程的详细信息。 ps 命令有多种不同的使用方法&#xff0c;这常常给初学者带来困惑。在各种 Linux 论坛上&#xff0c;询问 ps 命令语法的帖子屡…

双向链表--C语言实现数据结构

本期带大家一起用C语言实现双向链表&#x1f308;&#x1f308;&#x1f308; 文章目录 一、链表的概念&#x1f30e;二、链表中数据元素的构成&#x1f30e; &#x1f30d;三、链表的结构&#x1f30e; &#x1f30d; &#x1f30f;四、 双向带哨兵位循环链表的实现&#x1f3…

ROS2 中 使用奥比中光 Orbbec Astra Pro 深度相机

本文将以 Ubuntu 20.04 和 ROS2 foxy 环境为例&#xff0c;详细介绍如何在 ROS2 中使用奥比中光 Orbbec Astra Pro 深度相机。在这一篇文章中&#xff0c;你会学到如何创建工作空间&#xff0c;使用 usb_cam 功能包&#xff0c;编译安装使用 ros_astra_camera 等。 文章目录 1.…

年薪50万的程序员和一般的中学教师相比,被亲戚看不起

我是一名程序员&#xff0c;已经工作五年&#xff0c;年薪大概有50万左右。然后&#xff0c;亲戚家的孩子是博士生&#xff0c;在一所中学教书&#xff0c;自己一年的工资可以抵达五六年的薪资&#xff0c;不过还是被亲戚给鄙视了。 很多人都持有不同的观点。我自己是一名程序…