06-6.3.2 图的广度优先遍历

news2024/7/7 18:43:27

👋 Hi, I’m @Beast Cheng
👀 I’m interested in photography, hiking, landscape…
🌱 I’m currently learning python, javascript, kotlin…
📫 How to reach me --> 458290771@qq.com


喜欢《数据结构》部分笔记的小伙伴可以订阅专栏,今后还会不断更新。🧑‍💻
感兴趣的小伙伴可以点一下订阅、收藏、关注!🚀
谢谢大家!🙏

与树的广度优先遍历之间的联系

树的广度优先遍历[[5.4.3 树和森林的遍历]]
图的广度优先遍历和树类似
但是对于图来说:搜索相邻的结点时,有可能搜到已经访问过的结点
解决方法:对已经访问过的结点打上标记就行了

算法实现

广度优先遍历(BFS)要点:

  • 找到与一个顶点相邻的所有顶点
  • 标记哪些顶点被访问过
  • 需要一个辅助队列
bool visited[MAX_VERTEX_NUM];  // 标记访问数组

// 广度优先遍历
void BFS(Graph G, int v){  // 从顶点v出发,广度优先遍历图G
	visit(v);  // 访问初始顶点v
	visited[v] = TRUE;  // 对v做已访问标记
	EnQueue(Q, v);  // 顶点v入队列Q
	while(!isEmpty(Q)){
		DeQueue(Q, v);  // 顶点v出队列
		for(w=FirstNeighbor(G, v); w>=0; w=NextNeighbor(G, v, w)){
			// 检测v所有邻接点
			if(!visited[w]){  // w是v的尚未访问的邻接顶点
				visit(w);  // 访问顶点w
				visited[w] = TRUE;  // 对w做已访问标记
				EnQueue(Q, w);  // 顶点w入队列
			}
		}
	}
}

算法存在的问题

如果是非连通图,无法遍历完所有的结点
解决方法:增加一段代码

void BFSTraverse(Graph G){  // 对图G进行广度优先遍历
	for(i=0; i<G.vexnum; ++i)
		visited[i] = FALSE;  // 访问标记数组初始化
	InitQueue(Q);  // 初始化辅助队列Q
	for(i=0; i<G.vexnum; ++i)  // 从0号顶点开始遍历
		if(!visited[i])  // 对每个连通分量调用一次BFS
			BFS(G, i);  // vi从未访问过,从vi开始进行BFS
}

复杂度分析

邻接矩阵存储的图:
访问 ∣ V ∣ |V| V 个顶点都需要 O ( ∣ V ∣ ) O(|V|) O(V) 的时间
查找每个顶点的邻接点都需要 O ( ∣ V ∣ ) O(|V|) O(V) 的时间,而总共有 ∣ V ∣ |V| V 个顶点
时间复杂度 = O ( ∣ V ∣ 2 ) =O(|V|^2) =O(V2)


邻接表存储的图:
访问 ∣ V ∣ |V| V 个顶点都需要 O ( ∣ V ∣ ) O(|V|) O(V) 的时间
查找各个顶点的邻接点共需要 O ( ∣ E ∣ ) O(|E|) O(E) 的时间
时间复杂度 = O ( ∣ V ∣ + ∣ E ∣ ) =O(|V|+|E|) =O(V+E)


结论:对于 无向图,调用 BFS 函数的次数 = 连通分量数

广度优先生成树

广度优先生成树由广度优先遍历过程确定
由于邻接表的表示方式不唯一,因此基于邻接表的广度优先生成树也不唯一

广度优先生成森林

对非连通图的广度优先遍历,可得到广度优先生成森林

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

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

相关文章

学生用小台灯什么牌子的好?列举出几款学生用台灯推荐

眼睛是我们感知世界的窗口&#xff0c;但近年来&#xff0c;儿童青少年的视力健康却受到了严重困扰。数据显示&#xff0c;近视问题在儿童群体中呈现出明显的增长趋势&#xff0c;这给他们的学习和生活带来了诸多不便。虽然现代科技的快速发展使得电子产品成为了我们生活中不可…

UE5.4新功能 - Texture Graph上手简介

TextureGraph是UE5.4还在实验(Experimental)阶段的新功能&#xff0c;该功能旨在材质生成方面达到类似Subtance Designer的效果&#xff0c;从而程序化的生成一些纹理。 本文就来简要学习一下。 1.使用UE5.4或以上版本&#xff0c;激活TextureGraph插件 2.内容视图中右键找到…

React@16.x(47)路由v5.x(12)源码(4)- 实现 Route

目录 1&#xff0c;原生 Route 的渲染内容2&#xff0c;实现 1&#xff0c;原生 Route 的渲染内容 对如下代码来说&#xff1a; import { BrowserRouter as Router, Route } from "react-router-dom"; function News() {return <div>News</div>; }func…

【前端】IntersectionObserver 实现图片懒加载和无限滚动

【前端】IntersectionObserver 实现图片懒加载和无限滚动 在前端开发中&#xff0c;性能优化是一个重要的考量因素。随着现代网页和应用的复杂性增加&#xff0c;确保页面快速加载和流畅运行变得越来越重要。本文将介绍一种强大的工具——IntersectionObserver API&#xff0c…

【Linux进阶】文件和目录的默认权限与隐藏权限

1.文件默认权限&#xff1a;umask OK&#xff0c;那么现在我们知道如何建立或是改变一个目录或文件的属性了&#xff0c;不过&#xff0c;你知道当你建立一个新的文件或目录时&#xff0c;它的默认权限会是什么吗&#xff1f; 呵呵&#xff0c;那就与umask这个玩意儿有关了&…

HTTP与HTTPS协议区别及应用场景

HTTP&#xff08;超文本传输​​协议&#xff09;和 HTTPS&#xff08;安全超文本传输​​协议&#xff09;都是用于通过网络传输数据的协议。虽然它们有一些相似之处&#xff0c;但在安全性和数据保护方面也存在显著差异。 在这篇博文中&#xff0c;我们将探讨 HTTP 和 HTTPS…

基于antv x6实现的组织架构图

X6 是基于 HTML 和 SVG 的图编辑引擎&#xff0c;基于 MVC 架构&#xff0c;用户更加专注于数据逻辑和业务逻辑。 一、业务背景 将组织树形结构图形化&#xff0c;更直观的展示个人所在的组织架构。 二、功能点 组织结构按需渲染&#xff0c;支持层级展开、收缩按需求自定义…

MySQL表的练习

二、创建表 1、创建一个名称为db_system的数据库 create database db_system; 2、在该数据库下创建两张表&#xff0c;具体要求如下 员工表 user 字段 类型 约束 备注 id 整形 主键&#xff0c;自增长 id N…

机器人控制系列教程之Stewart平台简介和运动学分析

Stewart平台简介及应用场景 六自由度 Stewart 并联机器人结构简图如下图所示&#xff0c;主要有一个固定平台和一个移动平台以及六个可伸缩的推杆组成&#xff0c;通常情况下&#xff0c;固定平台与底座连接&#xff0c;移动平台在空间具有六个自由度&#xff0c;通过六个推杆…

Webpack: 基于Sourcemap源码映射原理与使用技巧

概述 Sourcemap 协议 最初由 Google 设计并率先在 Closure Inspector 实现&#xff0c;它的主要作用就是将经过压缩、混淆、合并的产物代码还原回未打包的原始形态&#xff0c;帮助开发者在生产环境中精确定位问题发生的行列位置&#xff0c;例如&#xff1a; 在 Webpack 内…

【话题】IT专业入门,高考假期预习指南

IT专业入门&#xff0c;高考假期预习指南 亲爱的高考学子们&#xff0c; 七月的阳光&#xff0c;如同你们的梦想&#xff0c;炽热而明亮。当你们手中的笔落下最后一道题的答案&#xff0c;那不仅仅是对过去十二年寒窗苦读的告别&#xff0c;更是对未知世界探索的启程号角。你们…

为了SourceInsight从Linux回到Windows

什么是SourceInsight 现在上网搜索这个软件&#xff0c;大多数说他是一个代码阅读软件&#xff1b;但是在官方的说法里面&#xff0c;这是一款支持多语言的编辑器。大概长这样&#xff1a; 看起来十分老旧是吧&#xff0c;但是他其实他已经是第四代了哈哈哈。其实这个软件是我…

c++:动态内存变量

典型的C面向对象编程 元素 (1)头文件hpp中类的定义 (2)源文件cpp中类的实现&#xff08;构造函数、析构函数、方法&#xff09; (3)主程序 案例 (1)用C来编程“人一天的生活” (2)“人”的属性&#xff1a;name、age、male (3)“人”的方法&#xff1a;eat、work(coding/shop…

【SSL 1056】最大子矩阵 (多维DP)

题目大意 已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵&#xff0c;你的任务是找到最大的非空&#xff08;大小至少是 1 ∗ 1 1*1 1∗1&#xff09;子矩阵。 比如&#xff0c;如下 4 ∗ 4 4*4 4∗4 子矩阵 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 的最大子矩阵是 …

构建LangChain应用程序的示例代码:53、利用多模态大型语言模型在RAG应用中处理混合文档的示例

许多文档包含多种内容类型&#xff0c;包括文本和图像。 然而&#xff0c;在大多数 RAG 应用中&#xff0c;图像中捕获的信息都会丢失。 随着多模态LLMs的出现&#xff0c;比如GPT-4V&#xff0c;如何在RAG中利用图像是值得考虑的。 本篇指南的亮点是&#xff1a; 使用非结…

Airflow: 大数据调度工具详解

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 欢迎关注微信公众号&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&a…

国产芯片方案/蓝牙咖啡电子秤方案研发

咖啡电子秤芯片方案精确值可做到分度值0.1g的精准称重,并带有过载提示、自动归零、去皮称重、压低报警等功能&#xff0c;工作电压在2.4V~3.6V之间&#xff0c;满足于咖啡电子秤的电压使用。同时咖啡电子秤PCBA设计可支持四个单位显示&#xff0c;分别为&#xff1a;g、lb、oz、…

stm32——定时器级联

在STM32当中扩展定时范围&#xff1a;单个定时器的定时长度可能无法满足某些应用的需求。通过级联&#xff0c;可以实现更长时间的定时&#xff1b;提高定时精度&#xff1a;能够在长定时的基础上&#xff0c;通过合理配置&#xff0c;实现更精细的定时控制&#xff1b;处理复杂…

Git安装以及环境配置(详细)

一、Git下载 1.官网&#xff08;但是很慢&#xff09; https://git-scm.com/ 2.镜像版&#xff08;比较推荐&#xff09; CNPM Binaries Mirror 里边多个选择合适的进行下载&#xff08;不要选带有rc0,rc1的&#xff0c;都是预发布版本&#xff09; 进入后如下&#xff0c…

【LeetCode】十一、滑动窗口:长度最小的子数组 + 定长子串的元音最大数目

文章目录 1、滑动窗口2、leetcode209&#xff1a;长度最小的子数组3、leetcode1456&#xff1a;定长子串中元音的最大数目 1、滑动窗口 如下&#xff0c;有一个数组&#xff0c;现三个元素为一组&#xff0c;求最大的和&#xff0c;自然可以while循环实现&#xff1a;i 、i1、…