【数据结构】图的遍历



快乐的流畅:个人主页


个人专栏:《C游记》《进击的C++》《Linux迷航》

远方有一堆篝火,在为久候之人燃烧!

文章目录

  • 引言
  • 一、深度优先遍历
    • 1.1 定义
    • 1.2 实现
  • 二、广度优先遍历
    • 2.1 定义
    • 2.2 实现
  • 三、DFS与BFS的对比

引言

前置知识:【数据结构】图的概念和存储结构

一、深度优先遍历

1.1 定义

深度优先遍历(Depth First Search,DFS),是一种从某个顶点开始,沿着一条路径不断深入到未访问的顶点,直到没有新的顶点可以访问为止。然后回溯到前一个顶点,再继续访问其他未被访问的顶点,直到所有顶点都被访问到。

1.2 实现

思路:

  1. 创建vis数组,用于标记已遍历过的顶点,初始为false。
  2. 由于DFS需要递归展开,所以分出一个子函数_DFS。
  3. 进入子函数代表已到达src,所以将vis[srci]标记为true。
  4. 随后for循环查找与当前点相连且没被遍历过的点,再次以新点作为当前点进入子函数,构成重复子问题。
  5. _DFS调用完后,再检查vis数组是否还有未被遍历的点。若有,则再次以此点进行_DFS,防止不连通的区域未被遍历
void _DFS(int srci, vector<bool>& vis)
{vis[srci] = true;cout << "[" << srci << "]" << ":" << _vertexs[srci] << endl;for (int i = 0; i < _vertexs.size(); ++i){if (_edges[srci][i] != W_MAX && !vis[i]){_DFS(i, vis);}}
}void DFS(const V& src)
{int n = _vertexs.size();vector<bool> vis(n, false);int srci = GetIndex(src);_DFS(srci, vis);//防止不连通的区域未被遍历for (int i = 0; i < n; ++i){if (!vis[i]){_DFS(i, vis);}}
}

细节:vis数组的作用,是为了保证遍历的过程中,不遍历相同的点,防止算法时间复杂度大大增加,导致冗余计算。利用vis数组不去遍历相同的点,这个过程又称为剪枝

二、广度优先遍历

2.1 定义

广度优先遍历(Breadth First Search, BFS),是一种从某个顶点开始,先访问当前顶点的所有邻接顶点,然后再依次访问这些邻接顶点的邻接顶点。BFS 是逐层遍历的过程,优先访问离起点较近的顶点。

2.2 实现

思路:

  1. 创建vis数组,用于标记已遍历过的顶点,初始为false。
  2. 创建队列,用于存储待访问的顶点下标。
  3. 初始化,将源点下标存入队列,vis中标记为true。
  4. while循环中,每次取出队头数据并弹出,随后for循环查找与当前点相连且没被遍历过的点,将其存入队列,并且vis中标记为true,构成重复子问题。
void BFS(const V& src)
{int n = _edges.size();vector<bool> vis(n, false);queue<int> q;int srci = GetIndex(src);q.push(srci);vis[srci] = true;int levelSize = 1;while (!q.empty()){//每层分行打印for (int i = 0; i < levelSize; ++i){int front = q.front();q.pop();cout << "[" << front << "]" << ":" << _vertexs[front] << " ";for (int j = 0; j < n; ++j){if (_edges[front][j] != W_MAX && !vis[j]){q.push(j);vis[j] = true;}}}cout << endl;levelSize = q.size();}
}

细节:levelSize的设置,是为了按源点的度从小到大分层打印。每次while循环里用for循环控制打印换行,随后更新levelSize。看似增加一套循环,实际并没有增加时间复杂度。

三、DFS与BFS的对比

以下是 深度优先遍历(DFS)广度优先遍历(BFS) 的对比表格:

特性深度优先遍历(DFS)广度优先遍历(BFS)
使用的数据结构栈(隐式或显式)队列
遍历顺序深入某一条路径,直至没有未访问顶点再回溯按层遍历,从起点逐层向外扩展
适用场景连通分量、拓扑排序、路径搜索最短路径、层次遍历、二分图判定
实现难度简单(递归实现)需要队列,稍复杂
空间复杂度O(V)(递归栈)O(V)(队列)
时间复杂度O(V + E)O(V + E)
  • V 是图中的顶点数,E 是图中的边数。

真诚点赞,手有余香

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

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

相关文章

linux用户管理运行级别找回root密码

目录 1.用户的添加 1.1用户添加的基本指令 1.2不指定家目录的名称 1.3指定家目录的名称 2.密码的修改 3.删除目录 3.1删除的两个情况 3.2删除的流程 4.查询用户的信息 5.用户的切换 6.用户组 6.1用户组的概念 6.2创建用户到指定的组 6.3修改用户到其他的组 6.4用…

SpringCloud Alibaba之Sentinel实现熔断与限流

&#xff08;学习笔记&#xff09; QPS&#xff08;Query Per Second&#xff09;&#xff1a;即每秒查询率&#xff0c;是对⼀个特定的查询服务器在规定时间内所处理流量多少的衡量标准。QPS req/sec 请求数/秒&#xff0c;即每秒的响应请求数&#xff0c;也即是最⼤吞吐能⼒…

ATTCK实战系列-Vulnstack三层网络域渗透靶场(一)

ATT&CK实战系列-Vulnstack三层网络域渗透靶场&#xff08;一&#xff09; 一、环境搭建1.1 靶场拓扑图1.2 靶场下载链接1.3 虚拟机配置1.3.1 Windows 7 (web服务器)1.3.2 Windows 2008 (域控)1.3.3 Win2k3 (域内主机) 二、外网打点突破2.1 信息搜集2.2 phpmyadmin 后台 Get…

肾癌的多模态预测模型-临床-组织学-基因组

目录 摘要 技术路线 ① lncRNA的预测模型 ②病理 WSI 的分类器 ③临床病理分类器 模型结果 与别的模型比较 同行评审学习 1&#xff09;使用lncRNA的原因 2&#xff09;模型临床使用意义 3&#xff09;关于截止值的使用 摘要 A multi-classifier system integrated…

.NET常见的5种项目架构模式

前言 项目架构模式在软件开发中扮演着至关重要的角色&#xff0c;它们为开发者提供了一套组织和管理代码的指导原则&#xff0c;以提高软件的可维护性、可扩展性、可重用性和可测试性。 假如你有其他的项目架构模式推荐&#xff0c;欢迎在文末留言&#x1f91e;&#xff01;&a…

Java_Day04学习

类继承实例 package com.dx.test03; public class extendsTest {public static void main(String args[]) {// 实例化一个Cat对象&#xff0c;设置属性name和age&#xff0c;调用voice()和eat()方法&#xff0c;再打印出名字和年龄信息/********* begin *********/Cat cat ne…

实战OpenCV之直方图

基础入门 直方图是对数据分布情况的图形表示&#xff0c;特别适用于图像处理领域。在图像处理中&#xff0c;直方图通常用于表示图像中像素值的分布情况。直方图由一系列矩形条&#xff08;也被称为bin&#xff09;组成&#xff0c;每个矩形条的高度表示某个像素值&#xff08;…

鸿蒙设置,修改APP图标和名称

1、先看默认的图标和名称 2、打开项目开始设置自己需要的图标和名称 2.1找到 路径src\main\module.json5&#xff0c; 找到 abilities&#xff0c;下的&#xff0c;图标icon、名称label&#xff0c;label可以按住ctrl鼠标左键点击跳转 2.2先修改APP名称 1、ctrl鼠标左键点击…

华为OD机试 - 选修课(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

【C语言零基础入门篇 - 15】:单链表

文章目录 单链表链表的基本概念单链表功能的实现单链表的初始化单链表新结点的创建单链表头插法单链表的输出单链表的查找单链表修改单链表的删除单链表所有数据结点释放源代码 单链表 链表的基本概念 一、什么是链表&#xff1f; 链表是数据结构中线性表的一种&#xff0c;其…

华为OD机试 - 需要打开多少监控器(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;E卷D卷A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加…

软考高级:数据库保持函数依赖和有损无损分解 AI 解读

讲解 生活化例子 想象你经营着一家快餐店&#xff0c;店里有各种商品&#xff0c;你也记录了每天的销量。你有一个表格&#xff0c;记录了「商品名称」、「价格」、「库存数量」、「供应商信息」等数据。最开始&#xff0c;你可能把所有数据都写在一张表上&#xff0c;但时间…

2024年9月22日---关于MyBatis框架(1)

一 Mybatis概述 1.1 简介 MyBatis&#xff08;官网&#xff1a;mybatis – MyBatis 3 | 简介 &#xff09;是一款优秀的开源的 持久层 框架&#xff0c;用于简化JDBC的开发。是 Apache的一个开源项目iBatis&#xff0c;2010年这个项目由apache迁移到了google code&#xff0c…

PCL 随机下采样

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&#xff09; 一、概述 随机下采样 是一种常用的点…

类和对象(2)(重点)

个人主页&#xff1a;Jason_from_China-CSDN博客 所属栏目&#xff1a;C系统性学习_Jason_from_China的博客-CSDN博客 所属栏目&#xff1a;C知识点的补充_Jason_from_China的博客-CSDN博客 类的默认成员函数 概念概述 默认成员函数就是用户没有显式实现&#xff0c;编译器会自…

项目扩展一:信道池的实现

项目扩展一&#xff1a;信道池的实现 一、为何要设计信道池1.引入信道的好处2.为何要设计信道池 二、信道池的设计1.服务器需要设计信道池吗&#xff1f;2.设计&#xff1a;动态变化的信道池1.为什么&#xff1f;2.怎么办&#xff1f;1.动态扩容和缩容2.LRU风格的信道置换3.小总…

0基础学习HTML(十三)布局

HTML 布局 网页布局对改善网站的外观非常重要。 请慎重设计您的网页布局。 如何使用 <table> 元素添加布局。 网站布局 大多数网站会把内容安排到多个列中&#xff08;就像杂志或报纸那样&#xff09;。 大多数网站可以使用 <div> 或者 <table> 元素来创建…

软件测试分类篇(下)

目录 一、按照测试阶段分类 1. 单元测试 2. 集成测试 3. 系统测试 3.1 冒烟测试 3.2 回归测试 4. 验收测试 二、按照是否手工测试分类 1. 手工测试 2. 自动化测试 3. 手工测试和自动化测试的优缺点 三、按照实施组织分类 1. α测试(Alpha Testing) 2. β测试(Beta…

【LTW】Domain General Face Forgery Detection by Learning to Weight

文章目录 Domain General Face Forgery Detection by Learning to Weightkey points方法LTW元分割策略学习过程损失函数实验评价结果消融实验总结Domain General Face Forgery Detection by Learning to Weight 会议:AAAI-21 作者: code: https://github.com/skJack/LTW 上…

理解JVM中的死锁:原因及解决方案

死锁是并发应用程序中的常见问题。在此类应用程序中&#xff0c;我们使用锁定机制来确保线程安全。此外&#xff0c;我们使用线程池和信号量来管理资源消耗。然而&#xff0c;在某些情况下&#xff0c;这些技术可能会导致死锁。 在本文中&#xff0c;我们将探讨死锁、死锁出现…