【408考点之数据结构】图的遍历
图的遍历
图的遍历是指从图中的某个顶点出发,按照一定的规则访问图中所有顶点,并使每个顶点仅被访问一次。图的遍历包括两种主要方法:深度优先搜索(DFS)和广度优先搜索(BFS)。这两种遍历方法在算法设计、路径搜索、网络分析等方面有广泛的应用。
深度优先搜索(DFS)
深度优先搜索类似于树的先序遍历,采用递归或栈的方式实现。DFS 从一个起始顶点开始,访问一个顶点后,继续访问它的未访问过的邻接顶点,直到所有邻接顶点都被访问过为止,然后回溯到上一个顶点,继续这一过程,直到所有顶点都被访问过为止。
实现步骤:
- 访问起始顶点,并标记为已访问。
- 从该顶点出发,依次访问每个未被访问的邻接顶点,重复步骤 1。
- 若当前顶点的所有邻接顶点都被访问过,则回溯到上一个顶点,继续访问其他未被访问的邻接顶点。
- 重复以上步骤,直到所有顶点都被访问过。
代码实现:
#include <stdio.h>
#include <stdlib.h>#define MAXVEX 100typedef struct EdgeNode {int adjvex;struct EdgeNode *next;
} EdgeNode;typedef struct VertexNode {int data;EdgeNode *firstEdge;
} VertexNode, AdjList[MAXVEX];typedef struct {AdjList adjList;int numVertexes, numEdges;
} GraphAdjList;void DFS(GraphAdjList *G, int i, int *visited) {EdgeNode *p;visited[i] = 1;printf("%d ", G->adjList[i].data);p = G->adjList[i].firstEdge;while (p) {if (!visited[p->adjvex]) {DFS(G, p->adjvex, visited);}p = p->next;}
}void DFSTraverse(GraphAdjList *G) {int visited[MAXVEX];for (int i = 0; i < G->numVertexes; i++) {visited[i] = 0;}for (int i = 0; i < G->numVertexes; i++) {if (!visited[i]) {DFS(G, i, visited);}}
}
广度优先搜索(BFS)
广度优先搜索类似于树的层次遍历,采用队列的方式实现。BFS 从一个起始顶点开始,访问一个顶点后,将其所有未被访问的邻接顶点依次入队,访问完当前顶点后,出队下一个顶点,继续这一过程,直到所有顶点都被访问过为止。
实现步骤:
- 访问起始顶点,并标记为已访问,将该顶点入队。
- 当队列不为空时,出队一个顶点,访问它的所有未被访问的邻接顶点,并将这些邻接顶点依次入队。
- 重复步骤 2,直到队列为空。
代码实现:
#include <stdio.h>
#include <stdlib.h>#define MAXVEX 100typedef struct EdgeNode {int adjvex;struct EdgeNode *next;
} EdgeNode;typedef struct VertexNode {int data;EdgeNode *firstEdge;
} VertexNode, AdjList[MAXVEX];typedef struct {AdjList adjList;int numVertexes, numEdges;
} GraphAdjList;void BFS(GraphAdjList *G, int i, int *visited) {EdgeNode *p;int queue[MAXVEX];int front = 0, rear = 0;printf("%d ", G->adjList[i].data);visited[i] = 1;queue[rear++] = i;while (front != rear) {i = queue[front++];p = G->adjList[i].firstEdge;while (p) {if (!visited[p->adjvex]) {printf("%d ", G->adjList[p->adjvex].data);visited[p->adjvex] = 1;queue[rear++] = p->adjvex;}p = p->next;}}
}void BFSTraverse(GraphAdjList *G) {int visited[MAXVEX];for (int i = 0; i < G->numVertexes; i++) {visited[i] = 0;}for (int i = 0; i < G->numVertexes; i++) {if (!visited[i]) {BFS(G, i, visited);}}
}
使用场景
- 网络爬虫:通过图的遍历算法,可以从一个网页开始,逐步访问所有相关网页。
- 社交网络分析:通过图的遍历算法,可以找出社交网络中各个用户之间的关系。
- 路径搜索:在地图应用中,通过图的遍历算法可以找到从一个地点到另一个地点的路径。
- 电路分析:在电路设计中,通过图的遍历算法可以分析电路中各个元件之间的连接关系。
相关文章:
【408考点之数据结构】图的遍历
图的遍历 图的遍历是指从图中的某个顶点出发,按照一定的规则访问图中所有顶点,并使每个顶点仅被访问一次。图的遍历包括两种主要方法:深度优先搜索(DFS)和广度优先搜索(BFS)。这两种遍历方法在…...
自动驾驶---Motion Planning之多段五次多项式
1 前言 在之前的博客系列文章中和读者朋友们聊过Apollo的 Motion Planning方案: 《自动驾驶---Motion Planning之LaneChange》 《自动驾驶---Motion Planning之Path Boundary》 《自动驾驶---Motion Planning之Speed Boundary》 《自动驾驶---Motion Planning之轨迹Path优化》…...
Linux基础IO操作详解
C文件IO相关接口 fopen函数 pathname: 要打开的文件名字符串mode: 访问文件的模式 模式描述含义“r”读文件不存在失败返回null“r”读写文件不存在打开失败返回null,文件存在则从头开始覆盖现有的数据(不会清空数据)“w”写文件不存在创建…...
轻松掌握:Hubstudio指纹浏览器如何接入IPXProxy代理IP
代理IP对于保护个人和企业网络安全起到了至关重要的作用,然而在需要多个工作的时候,就需要搭配指纹浏览器来使用。其中Hubstudio指纹浏览器就可以模拟多个浏览器环境,然而有些用户不知道如何将Hubstudio和代理IP一起使用,下面以…...
React小记(五)_Hooks入门到进阶
React 16.8 版本 类组件 和 函数组件 两种组件共存,到目前 React 18 版本,官方已经不在推荐使用类组件,在函数组件中 hooks 是必不可少的,它允许我们函数组件像类组件一样可以使用组件的状态,并模拟组件的生命周期等一…...
使用工业自动化的功能块实现大语言模型应用
大语言模型无所不能? 以chatGPT为代表的大语言模型横空出世,在世界范围内掀起了一场AI革命。给人的感觉似乎大模型语言无所不能。它不仅能够生成文章,图片和视频,能够翻译文章,分析科学和医疗数据,甚至可以…...
PPT文件中,母版视图与修改权限的区别
在PPT(PowerPoint)制作过程中,母版视图和修改权限是两个重要的概念,它们各自在演示文稿的编辑、管理和分发中扮演着不同的角色。本文将从定义、功能、使用场景及区别等方面详细探讨PPT母版视图与修改权限的异同。 PPT母版视图 定…...
php简单的单例模式
本文由 ChatMoney团队出品 单例模式是一种常用的设计模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。在 PHP 中实现单例模式通常有三种形式:饿汉式(Eager)、懒汉式(Lazy&…...
【面试题】IPS(入侵防御系统)和IDS(入侵检测系统)的区别
IPS(入侵防御系统)和IDS(入侵检测系统)在网络安全领域扮演着不同的角色,它们之间的主要区别可以归纳如下: 功能差异: IPS:这是一种主动防护设备,不仅具备检测攻击的能力&…...
宠物博主亲测养宠好物安利,口碑好的狗毛空气净化器推荐
作为一名6年资深铲屎官,一到春季换季就开始各种疯狂打喷嚏、全身过敏红肿,这是因为宠物在换季的时候就疯狂掉毛,家里就想下雪一样,空气中都是宠物浮毛。而宠物毛上附带的细菌会跟随浮毛被人吸入人体,从而产生打喷嚏、过…...
常用工具类
计算当天开始时间和结束时间 DateTime date DateUtil.date(); String startDateStr DateUtil.formatDateTime(DateUtil.beginOfDay(date)); String endDateStr DateUtil.formatDateTime(DateUtil.beginOfDay(DateUtil.offsetDay(date,1))); params.put("startDate&quo…...
【数据库原理】总结(期末版)
题型关系范式题[数据库原理]关系范式总结(自用)-CSDN博客事务分析题[数据库原理]事务-CSDN博客Sql题 MySQL:MySQL基本语法 Oracle:Oracle基本语法 关系代数[数据库原理]关系代数-CSDN博客 sql里面主要是考增删改查授权撤销权限等内容&#…...
【算能全国产AI盒子】基于BM1688CV186AH+FPGA智能物联工作站,支持差异化泛AI视觉产品定制
在数据呈现指数级增长的今天,越来越多的领域和细分场景对实时、高效的数据处理和分析的需求日益增长,对智能算力的需求也不断增强。为应对新的市场趋势,凭借自身的硬件研发优势,携手算能相继推出了基于BM1684的边缘计算盒子&#…...
材质相关内容整理 -ThreeJs
在Three.js中,材质是用来定义3D对象外观的关键部分。Three.js支持多种材质文件和类型,每种材质都有其特定的用途和优势。下面简单整理了一下目前Three.js支持的材质文件和类型。 一、Three.js支持的材质文件类型 JPEG (.jpg) 和 PNG (.png) 用途&#x…...
ES 嵌套查询
背景 一个配方由多种原材料组成,需求是根据各种原材料的用量搜索出对应的配方 配方实体类 class Formula {private long id;private String name;private List<Material> materials;}class Material {JsonProperty("material_id")private long m…...
《等保测评实战指南:从评估到加固的全程解析》
在当今数字化时代,信息安全已成为企业生存与发展的基石。随着网络攻击手段的不断演变和复杂度的提升,信息系统等级保护(简称“等保”)作为国家信息安全保障体系的重要组成部分,其重要性日益凸显。《等保测评实战指南&a…...
【24考研·交通】我的考研经历
文章目录 一、考前准备二、政治备考三、英语一备考四、数学一备考五、运筹学备考六、复试/调剂七、结语 距离24考研上考场过去快半年了,距离我拟录取也两个月多了,现在回想起来,最大的感受是:好像做了一场大梦。 其实这篇文章在考…...
ERP系统中有哪些模块?有哪些具体实现方案呢?
对于许多初次接触ERP系统的企业来说,可能会对系统中包含的模块和功能感到困惑。本文将详细介绍ERP系统中的主要模块,需要明确的是,ERP系统是一个庞大的系统,包含了多个模块,每个模块都有其独特的功能和作用。这些模块涵…...
扩散模型在机器学习中的应用及原理
扩散模型在机器学习中的应用及原理 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 什么是扩散模型? 在机器学习中,扩散模型ÿ…...
fastapi自定义中间件
fastapi自定义中间件 1、自定义中间件类 from fastapi import Request from starlette.middleware.base import BaseHTTPMiddlewareclass MyMiddleware(BaseHTTPMiddleware):def __init__(self, app,*args, **kwargs):super().__init__(app,*args, **kwargs)async def dispat…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
