一、广度优先搜索(BFS)

①找到与一个顶点相邻的所有顶点
②标记哪些顶点被访问过
③需要一个辅助队列

#define MaxVertexNum 100
bool visited[MaxVertexNum];  //访问标记数组 
void BFSTraverse(Graph G){  //对图进行广度优先遍历,处理非连通图的函数 for(int i=0;i<G.vexnum;i++)// 遍历一下所有的 顶点visited[i] = false;    // 将所有的顶点都  设为 未访问标志。InitQueue(Q);    //初始化辅助队列Q for(int i=0;i<G.vexnum;i++)// 从0号顶点开始遍历if(!visited[i])        // 对每个连通分量调用一次BFS() BFS(G,i);    
}
void BFS(Graph G,int v){visit(v);visited[V]=true;   //对v做已访问标记 EnQueue(Q,v);   //顶点v入队 while(isEmpty(Q)){Dequeue(Q,v);   //队首顶点v出队 //for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w))for(p=G.vertices[v].firstarc;p;p=p->nextarc){  //检测v的所有邻接点 w=p->adjvex;if(visited[w]==false){visit(w);  //w为v尚未访问的邻接点,访问w visited[w]=true;  // 对w做已访问标记 EnQueue(Q,w);  // 顶点w入队 }        	}}
}

无论是邻接矩阵还是邻接表的存储方式,BFS算法都需要借助一个辅助队列Q,
n个顶点均需要入队一次,在最坏的情况下,空间复杂度为O(|V|)

BFS遍历图的实质就是对每个顶点查找其邻接点的过程,耗费时取决于存储结构。
1、采用邻接表存储,每个顶点均需搜索(或入队)一次,时间复杂度为O(|V|),在搜索每个顶点的邻接点时
每条边至少被访问一次,时间复杂度为O(|E|),总的时间复杂度为 O(|V|+|E|)
2、采用邻接矩阵存储,查找每个顶点的邻接点所需要的时间为O(|V|),总的时间复杂度为O(|V|²) 

同一个图的邻接矩阵存储是唯一的,所以其广度优先生成树也是唯一的。
但因为邻接表存储表示不唯一,所以其广度优先生成树也是不唯一。 

广度优先搜索的应用——只可以检测无向图是否有环,有向图无法检测

二、深度优先搜索(DFS)

DFS算法是一个递归算法,需要借助一个递归工作栈,最好的空间复杂度是O(1),最差的空间复杂度是O(|V|)

DFS遍历图的实质就是对每个顶点查找其邻接点的过程,耗费时取决于存储结构。
1、采用邻接表存储,每个顶点均需搜索(或入队)一次,时间复杂度为O(|V|),在搜索每个顶点的邻接点时
每条边至少被访问一次,时间复杂度为O(|E|),总的时间复杂度为 O(|V|+|E|)
2、采用邻接矩阵存储,查找每个顶点的邻接点所需要的时间为O(|V|),总的时间复杂度为O(|V|²)  

#define MAX_VERTEX_NUM 100
bool visited[MAX_VERTEX_NUM]; //访问标记数组 
void DFSTraverse(Graph G)  //对图进行深度优先遍历 
{for(v=0;v<G.vexnum;i++)visited[v]=false;   //初始化已访问标记数组 for(v=0;v<G.vexnum;i++)   //本代码是从v0开始遍历 if(!visited[v])   //对尚未访问的顶点调用DFS() DFS(G,v);
}//用邻接表实现深度优先搜索算法 
void DFS(ALGraph G,int v)
{visit(v);   visited[v]=true;for(p=G.vertices[v].firstarc;p;p=p->nextarc){  //检测v的所有邻接点 j=p->adjvex;if(!visited[w])DFS(G,w);    	  //j为v的尚未访问邻接点,递归访问v }}//用邻接矩阵实现深度优先搜索算法 
void DFS(MLGraph G,int v)
{visit(v);   visited[v]=true;for(j=0;j<G.vexnum;j++){  //检测v的所有邻接点 if(visited[j]==false && G.edge[i][j]==1)DFS(G,j);    	  //j为v的尚未访问邻接点,递归访问v }}

深度优先搜索应用——检测是否有向图/无向图是否有环

比如,无向图,先访问结点1,再访问结点2,再访问结点5,再访问结点3,此时结点3有两个邻接点,在先访问结点2的情况下,发现结点2已经被访问过,并且不是结点3的父节点,结点3的父节点是它的来时路——结点5。则此时,图里存在环。

 三、图的遍历与连通性

1、对于无向图来说,若无向图是连通的,则从任意一个结点出发,仅需一次遍历就能访问图中所有顶点;若无向图是非连通的,则从某一个顶点出发,一次性只能访问到该顶点所在连通分量的所有顶点 
2、对于无向图,BFSTraverse、 DFSTraverse这两个函数调用BFS、DFS的次数等于该图的连通分量 
3、对于有向图来说,若从初始顶点到图中的每个顶点都有路径,则能够访问到图中的所有顶点,否则不能访问到所有顶点。(即与是否为强连通图无关)
4、对于有向图,非强连通分量一次调用不一定能访问到该子图的所有顶点。 

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

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

相关文章

直击WAIC | 百度袁佛玉:加速具身智能技术及产品研发,助力场景应用多样化落地

7月26日&#xff0c;2025世界人工智能大会暨人工智能全球治理高级别会议&#xff08;WAIC&#xff09;在上海开幕。同期&#xff0c;由国家地方共建人形机器人创新中心&#xff08;以下简称“国地中心”&#xff09;与中国电子学会联合承办&#xff0c;百度智能云、中国联通上海…

2025年人形机器人动捕技术研讨会将在本周四召开

2025年7月31日爱迪斯通所主办的【2025人形机器动作捕捉技术研讨会】是携手北京天树探界公司线下活动结合线上直播的形式&#xff0c;会议将聚焦在“动作捕捉软硬件协同&#xff0c;加速人形机器人训练”&#xff0c;将深度讲解多项核心技术&#xff0c;包含全球知名的惯性动捕大…

Apple基础(Xcode①-项目结构解析)

要运行设备之前先选择好设备Product---->Destination---->选择设备首次运行手机提示如出现 “未受信任的企业级开发者” → 手机打开 设置 ▸ 通用 ▸ VPN与设备管理 → 信任你的 Apple ID 即可ContentView 是 SwiftUI 项目里 最顶层、最主界面 的那个“页面”&#xff0…

微服务 02

一、网关路由网关就是网络的关口。数据在网络间传输&#xff0c;从一个网络传输到另一网络时就需要经过网关来做数据的路由和转发以及数据安全的校验。路由是网关的核心功能之一&#xff0c;决定如何将客户端请求映射到后端服务。1、快速入门创建新模块&#xff0c;引入网关依赖…

04动手学深度学习笔记(上)

04数据操作 import torch(1)张量表示一个数据组成的数组&#xff0c;这个数组可能有多个维度。 xtorch.arange(12) xtensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])(2)通过shape来访问张量的形状和张量中元素的总数 x.shapetorch.Size([12])(3)number of elements表…

MCU中的RTC(Real-Time Clock,实时时钟)是什么?

MCU中的RTC(Real-Time Clock,实时时钟)是什么? 在MCU(微控制器单元)中,RTC(Real-Time Clock,实时时钟) 是一个独立计时模块,用于在系统断电或低功耗状态下持续记录时间和日期。以下是关于RTC的详细说明: 1. RTC的核心功能 精准计时:提供年、月、日、时、分、秒、…

Linux 进程调度管理

进程调度器可粗略分为两类&#xff1a;实时调度器(kernel)&#xff0c;系统中重要的进程由实时调度器调度&#xff0c;获得CPU能力强。非实时调度器(user)&#xff0c;系统中大部分进程由非实时调度器调度&#xff0c;获得CPU能力弱。实时调度器实时调度器支持的调度策略&#…

基于 C 语言视角:流程图中分支与循环结构的深度解析

前言&#xff08;约 1500 字&#xff09;在 C 语言程序设计中&#xff0c;控制结构是构建逻辑的核心骨架&#xff0c;而流程图作为可视化工具&#xff0c;是将抽象代码逻辑转化为直观图形的桥梁。对于入门 C 语言的工程师而言&#xff0c;掌握流程图与分支、循环结构的对应关系…

threejs创建自定义多段柱

最近在研究自定义建模&#xff0c;有一个多断柱模型比较有意思&#xff0c;分享下&#xff0c;就是利用几组点串&#xff0c;比如上中下&#xff0c;然后每组点又不一样多&#xff0c;点续还不一样&#xff0c;(比如第一个环的第一个点在左边&#xff0c;第二个环在右边)&#…

Language Models are Few-Shot Learners: 开箱即用的GPT-3(四)

Result续 Winograd-Style Tasks Winograd-Style Tasks 是自然语言处理中的一类经典任务。它源于 Winograd Schema Challenge(WSC),主要涉及确定代词指的是哪个单词,旨在评估模型的常识推理和自然语言理解能力。 这个任务中的具体通常包含高度歧义的代词,但从语义角度看…

BGP高级特性之认证

一、概述BGP使用TCP作为传输协议&#xff0c;只要TCP数据包的源地址、目的地址、源端口、目的端 口和TCP序号是正确的&#xff0c;BGP就会认为这个数据包有效&#xff0c;但数据包的大部分参数对于攻击 者来说是不难获得的。为了保证BGP免受攻击&#xff0c;可以在BGP邻居之间使…

商旅平台怎么选?如何规避商旅流程中的违规风险?

在中大型企业的商旅管理中&#xff0c;一个典型的管理“黑洞”——流程漏洞与超标正持续吞噬企业成本与管理效能&#xff1a;差标混乱、审批脱节让超规订单频频闯关&#xff0c;不仅让企业商旅成本超支&#xff0c;还可能引发税务稽查风险。隐性的合规风险&#xff0c;比如虚假…

Anaconda的常用命令

Anaconda 是一个用于科学计算、数据分析和机器学习的 Python 发行版&#xff0c;包含了大量的预安装包。它配有 conda 命令行工具&#xff0c;方便用户管理包和环境。以下是一些常用的 conda 命令和 Anaconda 的常见操作命令&#xff0c;帮助你高效管理环境和包。1. 环境管理创…

JVM之【Java虚拟机概述】

目录 对JVM的理解 JVM的架构组成 类加载系统 执行引擎 运行时数据区 垃圾收集系统 本地方法库 对JVM的理解 JVM保证了Java程序的执行&#xff0c;同时也是Java语言具有跨平台性的根本原因&#xff1b;Java源代码通过javac等前端编译器生成的字节码计算机并不能识别&…

RabbitMQ+内网穿透远程访问教程:实现异地AMQP通信+Web管理

RabbitMQ是一个开源的消息队列中间件&#xff0c;基于Erlang开发&#xff0c;遵循AMQP&#xff08;Advanced Message Queuing Protocol&#xff0c;高级消息队列协议&#xff09;标准&#xff0c;主要用于实现异步通信、消息解耦和系统间数据传输。它的核心作用是在分布式系统中…

go 语言 timer 与 ticker理论和实例大全

目录 1. 时间之门的钥匙:Timer与Ticker的本质 2. Timer:精准的单次计时 2.1 Timer的基础用法 2.2 停止与重置Timer 2.3 Timer的高级技巧:优雅处理并发 3. Ticker:时间的节拍器 3.1 Ticker的基本用法 3.2 Ticker的高级应用:动态调整周期 4. Timer与Ticker的结合:打…

MySQL 45讲 16-17

全字段排序 explain 中的 using fiesort ,扫描 数据,取出符合判断条件的 数据,到sort buffer中,然后对排序字段采用快速排序进行 排序后直接将 所需字段进行返回 如果 字段长度所占内存大于所分配 的sort buffer ,需要借助 临时文件 进行 数据的存放排序,此时会采用 归并排序,将…

QT项目 -仿QQ音乐的音乐播放器(第四节)

一、RecBox中btUp和btDown按钮clicked处理 选中左右键&#xff08;btUp和btDown按钮&#xff09;然后右击转到槽->click() void RecBox::on_btUp_clicked() {}void RecBox::on_btDown_clicked() {} 二、imageList中图片分组 // recbox.h 中新增 int currentIndex; // 标记…

DeepSeek SEO关键词优化提升流量增长

内容概要DeepSeek SEO关键词优化致力于通过科学的方法&#xff0c;显著提升网站在搜索引擎中的可见度与自然流量。其核心在于深入理解并精准匹配用户的真实搜索意图&#xff0c;而非仅仅堆砌词汇。具体来说&#xff0c;该策略运用深度意图导向策略&#xff0c;确保内容与用户需…

# Ubuntu 系统设置 USB PnP 音频设备为默认设备的完整教程

Ubuntu 系统设置 USB PnP 音频设备为默认设备的完整教程 在使用 Ubuntu 系统时&#xff0c;尤其是在嵌入式设备如 NVIDIA Jetson 系列上&#xff0c;我们经常需要将 USB PnP 音频设备设置为默认设备。本文将详细介绍如何通过命令行配置&#xff0c;使 USB PnP 音频设备在系统重…