数据结构 —— 图的遍历

数据结构 —— 图的遍历

  • BFS(广度遍历)
  • 一道美团题
  • DFS(深度遍历)

我们今天来看图的遍历,其实都是之前在二叉树中提过的方法,深度和广度遍历

在这之前,我们先用一个邻接矩阵来表示一个图:

#pragma once
#include<iostream>
#include<vector>
#include<map>
using namespace std;//图的模板化
namespace matrix
{template<class V, class W, W MAX_W, bool Direction = false>class Graph{public:Graph(const V* vertex, size_t n){//开辟空间_vertex.reserve(n);for (int i = 0; i < n; i++){_vertex.push_back(vertex[i]);_index[vertex[i]] = i;}//初始化矩阵_matrix.resize(n);for (auto& e : _matrix){e.resize(n, MAX_W);}}//寻找图中的点size_t FindSrci(const V& vertex){auto ret = _index.find(vertex);if (ret != _index.end()){return ret->second;}else{throw invalid_argument("不存在的顶点");return -1;}}void _AddEdge(size_t srci, size_t desi, W w){_matrix[srci][desi] = w;if (Direction == false){_matrix[desi][srci] = w;}}//加边void AddEdge(const V& srci, const V& desi, W w){size_t srcIndex = FindSrci(srci);size_t desIndex = FindSrci(desi);_AddEdge(srcIndex, desIndex, w);}void Print(){//打印标题行cout << "      ";for (int i = 0; i < _vertex.size(); i++){cout << _vertex[i] << " ";}cout << endl;//打印矩阵for (int i = 0; i < _vertex.size(); i++){cout << _vertex[i] << " ";for (int j = 0; j < _matrix[i].size(); j++){if (_matrix[i][j] != MAX_W){printf("%5d", _matrix[i][j]);}else{printf("%5c", '#');}}cout << endl;}}private://存放顶点vector<V> _vertex;//映射关系map<V, size_t> _index;//矩阵,图的表示vector<vector<W>> _matrix;};void TestGraph(){Graph<char, int, INT_MAX, true> g("0123", 4);g.AddEdge('0', '1', 1);g.AddEdge('0', '3', 4);g.AddEdge('1', '3', 2);g.AddEdge('1', '2', 9);g.AddEdge('2', '3', 8);g.AddEdge('2', '1', 5);g.AddEdge('2', '0', 3);g.AddEdge('3', '2', 6);g.Print();}void TestGraph2(){string a[] = {"海皇","高斯","小傲","小潮","胖迪","小杨","皖皖"};Graph<string, int,INT_MAX, false> g1(a, sizeof(a)/sizeof(a[0]));g1.AddEdge("小潮", "小傲", 30);g1.AddEdge("小潮", "高斯", 83);g1.AddEdge("小潮", "海皇", 34);g1.AddEdge("胖迪", "海皇", 78);g1.AddEdge("胖迪", "小傲", 76);g1.AddEdge("小杨", "皖皖", 54);g1.AddEdge("小杨", "高斯", 48);g1.Print();}
}

在这里插入图片描述在这里插入图片描述

BFS(广度遍历)

广度优先遍历和之前二叉树的广度优先遍历一样,我们需要队列来辅助
在这里插入图片描述我们逻辑上是这张图,但是我们实际遍历的时候,我们遍历的是一个矩阵(二维数组)
在这里插入图片描述因为这个图是联通图,我们从任意一个顶点出发都可以遍历完所有顶点,假设我们从小潮开始:
在这里插入图片描述我们仿照二叉树那里的思路,把相连的节点入队列,把小傲,高斯,海皇入队列:
在这里插入图片描述在矩阵上的表现就是把小潮这一行,不为#的数值的结点入队列
在这里插入图片描述好,现在有一个问题,假设我现在遍历到了海皇,海皇和小潮相连,按照上面的规则,我们应该把小潮入队列,但是我们一开始就是从小潮开始的,就会造成重复访问,这该则么办呢?

所以在图这里,我们要引入一个数组,标记我们已经访问过的结点,标记过的结点在之后的访问过程中不再入队

在这里插入图片描述
我们来实现一下:

	void BFS(const V& vertex){int vertexIndex = FindSrci(vertex);//队列和标记数组int n = _vertex.size();queue<size_t> q;vector<bool> visited(n, false);//先入最先访问节点q.push(vertexIndex);//标记visited[vertexIndex] = true;while (!q.empty()){//出队size_t front = q.front();q.pop();cout << _vertex[front] << " ";//遍历该行for (int i = 0; i < _vertex.size(); i++){if (_matrix[front][i] != MAX_W){if (visited[i] == false){q.push(i);visited[i] = true;}}}cout << endl;}}

一道美团题

在这里插入图片描述读了题之后,这里让我们计算几度好友,其实我们在BFS已经按照一度二度的顺序打印了,但是我们没有区分,我们区分一下就可以了

void BFS(const V& vertex)
{// 获取目标顶点的索引int vertexIndex = FindSrci(vertex);// 初始化队列和标记数组int n = _vertex.size();queue<size_t> q; // 创建一个队列用于存储待访问的顶点vector<bool> visited(n, false); // 创建一个布尔数组,用于标记顶点是否已被访问// 将起始顶点添加到队列中,并标记为已访问q.push(vertexIndex);visited[vertexIndex] = true;int levelSize = 1; // 初始化当前层级的顶点数量,初始时只有起始顶点int degree = 0; // 初始化度数(即好友的层次)// 当队列非空时,继续广度优先搜索while (!q.empty()){// 输出当前度数的好友cout << "[" << degree << "]" << "度好友 ";// 对当前层级的所有顶点进行处理for (int j = 0; j < levelSize; j++){// 从队列中取出一个顶点size_t front = q.front();q.pop();// 输出当前顶点的信息cout << _vertex[front] << " ";// 遍历与当前顶点相邻的所有顶点for (int i = 0; i < _vertex.size(); i++){// 如果存在一条边连接当前顶点和下一个顶点if (_matrix[front][i] != MAX_W){// 如果下一个顶点未被访问过if (!visited[i]){// 将下一个顶点添加到队列中,以便后续访问q.push(i);// 标记下一个顶点为已访问visited[i] = true;}}}}// 更新下一层级的顶点数量levelSize = q.size();// 换行输出,准备进入下一度数的好友输出cout << endl;// 增加度数计数器degree++;}// 最终换行,使输出更清晰cout << endl;
}

在这里插入图片描述

DFS(深度遍历)

深度遍历是一条道走到黑:
在这里插入图片描述

// 深度优先搜索的私有辅助函数
void _DFS(size_t vertexIndex, vector<bool>& visited)
{// 如果当前顶点尚未访问过if (!visited[vertexIndex]){// 输出当前顶点的值cout << _vertex[vertexIndex] << endl;// 将当前顶点标记为已访问visited[vertexIndex] = true;// 遍历所有顶点for (size_t i = 0; i < _vertex.size(); i++){// 如果当前顶点和遍历到的下一个顶点之间存在边,// 表示为权重不是最大可能权重(MAX_W),// 则对下一个顶点进行深度优先搜索if (_matrix[vertexIndex][i] != MAX_W)_DFS(i, visited);}}
}// 公开的深度优先搜索函数,从给定的顶点开始
void DFS(const V& vertex)
{// 查找给定顶点在顶点列表中的索引size_t vertexIndex = FindSrci(vertex);// 初始化一个布尔向量来跟踪每个顶点是否已被访问vector<bool> visited(_vertex.size(), false);// 调用私有辅助函数进行深度优先搜索_DFS(vertexIndex, visited);
}

在这里插入图片描述
(注:本人是小潮院长粉丝,该文章中举的例子不代表真实好友关系,无意挑拨小潮院长内部成员关系,如有冒犯,请不要打我…)

在这里插入图片描述

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

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

相关文章

220千伏变电站辅助设备智能监控平台 无人化与自动化升级改造工程

220千伏变电站特点 高电压等级&#xff1a;220千伏变电站的最大特点是其高压传输能力&#xff0c;能够将发电厂产生的电能高效地传输到较远的地区&#xff0c;满足大型城市及工业区域的用电需求。 输电能力大&#xff1a;220千伏变电站在输电能力上远大于普通的110千伏或更低…

Mybatis框架的集成使用

1_框架概述 框架是一个半成品&#xff0c;已经对基础的代码进行了封装并提供相应的API&#xff0c;开发者在使用框架时直接调用封装好的api可以省去很多代码编写&#xff0c;从而提高工作效率和开发速度,框架是一种经过校验、具有一定功能的半成品软件. 经过校验&#xff1a;指…

【超万卡GPU集群关键技术深度分析 2024】

文末有福利&#xff01; 1. 集群高能效计算技术 随着大模型从千亿参数的自然语言模型向万亿参数的多模态模型升级演进&#xff0c;超万卡集群吸需全面提升底层计算能力。 具体而言&#xff0c;包括增强单芯片能力、提升超节点计算能力、基于 DPU (Data Processing Unit) 实现…

浅聊权限系统设计模型

浅聊权限系统设计模型 设计权限目的 目前主流的各类权限管理模型,如基于用户、角色组、实体等等的权限模型,结合产品本身的业务、面临的问题和未来的发展兼容,进行权限模型选型,找到适合产品本身的权限范式体系。 权限模型类型 ACL:权限控制列表(Access Control List)D…

Mx Admin 基于react18的后台管理系统

前言 Mx Admin 基于React18 vite5 antd5的后台管理系统&#xff0c; 基于RBAC的权限控制系统&#xff0c;动态菜单和动态路由支持tab路由缓存嵌套菜单支持多种菜单布局模式亮暗色主题切换

Enzo Life Sciences热点分享:细胞治疗中的T细胞活化

细胞治疗&#xff08;Cell Therapy&#xff09;作为一种新近发展起来的癌症治疗方法&#xff0c;是一种利用患者自体&#xff08;或异体&#xff09;的成体细胞&#xff08;或干细胞&#xff09;对组织、器官进行修复的治疗方法。通常是由免疫细胞和相关的细胞产生调节细胞功能…

Java判断范围型的数据是否存在重叠(数值类型、日期类型)

为什么写这么一篇文章呢&#xff1f; 遇到了个问题&#xff0c;同一天可以输入多个时间段&#xff0c;但是每个时间段的时间不能出现重叠。 纳尼&#xff0c;这不就是判断数据返回是否有重叠的变种嘛~ 简单&#xff0c;开搞 数字范围是否重叠判断 这里以int类型为例了&…

linux配置qqbot(Mirai+Alicebot)

虽然最终没有成功配置好qqbot&#xff0c;但是感觉这个过程还是值得记录的&#xff0c;所以写出了下文 最终因为登陆qq时的code45问题导致没有成功登录&#xff0c;据说更换qq号或者配置签名服务器是有可能可行的。 安装环境 安装mcl&#xff08;mirai的控制台&#xff09; …

【单片机毕业设计选题24046】-基于单片机的智能鱼缸设计

系统功能: 检测水温&#xff0c;水温过低开启PTC加热。检测水位&#xff0c;水位过低开启水泵抽水。检测湿度&#xff0c;湿度过高则开启风扇通风。 检测PH值和浑浊度&#xff0c;TTS语音播报功能&#xff0c;OLED显示系统信息&#xff0c;蓝牙模块连接手机APP。 系统上电后…

IT专业入门,高考假期预习指南—初识产品经理BRD、MRD 和 PRD

七月来临&#xff0c;各省高考分数已揭榜完成。而高考的完结并不意味着学习的结束&#xff0c;而是新旅程的开始。对于有志于踏入IT领域的高考少年们&#xff0c;这个假期是开启探索IT世界的绝佳时机。作为该领域的前行者和经验前辈&#xff0c;你是否愿意为准新生们提供一份全…

AI 芯片之战:开启智能新时代的关键角逐

在科技发展的浪潮中&#xff0c;一场围绕 AI 芯片的激烈竞争正在全球范围内如火如荼地展开。多家巨头纷纷投身其中&#xff0c;使得这场混战已然进入白热化阶段。 AI 芯片&#xff0c;作为推动人工智能发展的核心硬件&#xff0c;其作用举足轻重。它能够高效地处理海量的数据&a…

生物分子生物学实验过程的自动化与智能监控系统设计

开题报告&#xff1a;生物分子生物学实验过程的自动化与智能监控系统设计 一、引言 随着生物科学技术的飞速发展&#xff0c;生物分子生物学实验在科研、医疗、农业等领域的应用日益广泛。然而&#xff0c;传统的生物分子生物学实验过程大多依赖于人工操作&#xff0c;存在操…

java web 部分

jsp作用域由大到小 过滤器有哪些作用&#xff1f; 过滤器的用法&#xff1f;&#xff08;对客户端的请求统一编码和对客户端进行认证&#xff09; JSP和Servlet中的请求转发分别如何实现&#xff1f; JSP 和 Servlet 有哪些相同点和不同点&#xff0c;他们之间的联系是什么…

PCB设计时,信号走线要先过ESD/TVS管,这是为什么?

目录 为什么有上面这个问题&#xff1f; 问题的原因——走线电感 走线电感的阻抗 电感的影响 小结 都说接口处的信号要先过ESD/TVS管&#xff0c;然后拉到被保护器件&#xff0c;为什么不这样做效果就不好&#xff1f;那如果受板子实际情况限制&#xff0c;必须这样layout…

Python - 单引号与双引号

Python 版本 3.11.4 字符串 单个文字符称为字符&#xff0c;多个文字符成为字符串。 字符串需要被&#xff08;单引号&#xff09;或者""&#xff08;双引号&#xff09;包括。 language "Python"language Python 以上写法都是合法的。 单引号与双…

Zabbix 配置MySQL数据库监控

Zabbix MySQL数据库监控简介 通过 Zabbix 监控 MySQL 数据库&#xff0c;可以获取有关数据库性能、运行状况和资源使用情况的详细信息&#xff0c;帮助及时发现和解决问题。 Zabbix官方提供了一个名为MySQL by Zabbix agent的监控模板&#xff0c;该模板专为 Zabbix 通过 Zabb…

探索Vim表达式寄存器:提升文本处理的高级技巧

探索Vim表达式寄存器&#xff1a;提升文本处理的高级技巧 Vim是一款功能强大的文本编辑器&#xff0c;它拥有丰富的寄存器系统&#xff0c;用于存储文本、命令等。表达式寄存器是Vim中一种特殊的寄存器&#xff0c;允许用户存储并操作表达式的结果。本文将详细介绍如何在Vim中…

使用Spring Boot和mkcert解决本地及局域网HTTPS访问

在现代Web开发中&#xff0c;HTTPS已经成为保障数据传输安全的标准。然而&#xff0c;在开发和测试阶段&#xff0c;配置HTTPS可能会带来一些额外的复杂性。尤其是在本地开发环境和局域网内网环境中&#xff0c;获得和配置证书通常是一个挑战。本文将介绍如何使用Spring Boot和…

关于在自己的生活里面,增加喝咖啡的这道手续

前言&#xff1a;我总在告诉我自己&#xff0c;我自己应该如何&#xff1f;我的未来应该如何&#xff1f;到那时实际上&#xff0c;自己没有办法能够理解的确实我的现在&#xff0c;我应该依靠咖啡度过我自己剩下的岁月&#xff0c;接下来&#xff0c;让自己用自己的方式来不断…

华为5288 V5服务器安装BCLinux8U4手记

本文记录了华为5288 V5服务器安装BCLinux8U4操作系统的过程。 一、系统环境 1、服务器 华为FusionServer Pro 5288 V5服务器 2、操作系统 BCLinux-R8-U4-Server-x86_64-220725.iso 官网下载地址 sha256sum&#xff1a;1d31d3b8e02279e89965bd3bea61f14c65b9d32ad2ab6d4eb…