B站左神算法课学习笔记(P7):图

目录

一、图的存储方式(千奇百怪)

1)邻接表

2)邻接矩阵

3)其他

4)推荐存储方式(代码)

二、图的遍历

(1)宽度优先遍历

(2)深度优先遍历

​编辑 三、拓扑排序算法

四、kruskal与prim(针对无向图)

(1)kruskal算法

(2)prim算法

五、Dijkstra算法


一、图的存储方式(千奇百怪

1)邻接表

2)邻接矩阵

3)其他

也可以用数组表示图:

Q:一个数组arr,存储一个没有环的特殊图,其每个位置上的数字代表其父节点(eg:arr[0] = 5表示0的父节点是5),以此类推可得到下面的图:

使用小数组表示图:

一个数组中每一个位置都存放着一个数组,它依次存储【权重,起始点,中止点】,因此 [3, 0, 2] 就代表着有一条权重为3,从0开始,指到2的边,其余以此类推:

由于表达图的方式 千 奇 百 怪 ,所以推荐:

(1)选择一种习惯的图表示方法,用该种表示方式来实现所有的图的算法;

(2)想办法将题中所给出来的图转化为自己熟悉的图的表示方法,再运用写好的算法即可!

4)推荐存储方式(代码)

一种供参考的图的存储方式:

转化示例:

二、图的遍历

(1)宽度优先遍历

区别二叉树的宽度优先遍历,因为图中可能含有环!

仍然借助队列实现(二叉树的宽度优先遍历也是借助队列): 

结合画图理解:

tips:若需要进一步减少常数级别的耗时,可以采用数组来替换哈希表,因为数组的查询比哈希表更快一些; 

(2)深度优先遍历

借助栈和哈希表来实现:

结合下图来理解:

中保存的是DFS的路线!


 三、拓扑排序算法

适用范围:要求有向图,且有入度为0的节点,没有环。

常用环境:编译顺序

如下图所示,假设编译文件A需要先编译文件BCD,编译文件B又需要先编译文件CDE,请问应该以什么样的顺序编译整个文件?

算法思路:

        1、先找到一个入度为0的点,记录该点,并删除其“影响”(此处指有向边);

        2、重复上述过程直到没有未记录的节点;

四、kruskal与prim(针对无向图)

作用:生成最小生成树(在保证连通性的情况下,确保边的权值总和最小);

(1)kruskal算法

的角度出发考虑,对于所有边,按照权重排序;依次连线上最小的边,若会形成,则去掉这条边。

检查是否形成环会用到“并查集”的概念,该部分实现将会在后续课程涉及。

例1:

 例2:是否成环 == in节点和out节点是否属于同一个集合中

并查集的简单替换:(比并查集慢)

思路:定义一个setMap,里面存储着每个节点和它所属的集合;为主函数提供两个方法——一个用于判断from和to节点是否处于同一个集合中,另一个用于实现合并集合的操作。

有了上述的并查集结构后,我们可以实现k算法:

(2)prim算法

的角度出发考虑,从任意的点开始,标记该点使用过,对于该点可达的边标记为解锁状态;选择当前解锁边中两侧点不全出现过且权值最小的一条,将其标记为使用过,并标记该边连接的另一个节点为使用过;重复上述直到用过所有点。

:假设从A开始,解锁AB6、AC1、AD5三条边;选择AC1边,解锁CB5、CE6、CF4、CD5边;选择CD4边,解锁FE5、FD2边;选择FD2边,无需解锁;此时【ACFD】已经被使用,故只能选择CB5而非CD5、AD,解锁AB6、BE3;选择BE3,已经遍历所有点,p算法结束。

思考:为什么k算法需要并查集(集合查询结构)而p算法不需要?

k算法可能出现已经连成将节点两小片后再将两边相连成一大片的情况;而p算法总是选择相邻(已解锁)的边,使用哈希表即可。

代码实现:

结合图像理解:当A选择B时,AB、AC会被添加,但是由于A、B两点已经被食用过,所以会直接跳过AB边而寻找其他边!

五、Dijkstra算法

适用范围:可以有权值为负数的边,但是不能有累加和为负数的环!

作用:指定一个点,给出从该节点出发到所有其他点的最短距离。

算法流程:初始化一个距离表,将初始节点置为0,初始节点到其他节点的距离置为正无穷;每次从距离表中选取距离最近的节点,检查其所有边的权重,若从原点通过该点到达下一个点的距离更小,则更新距离表,否则不做处理;重复上述过程直至完成对所有点的遍历。

例:

代码实现:

堆优化思路:之前寻找最小值使用遍历的方法,所以较慢,所以考虑使用堆来存储数据;但是当权值更新后,不一定还能满足堆的顺序,此时需要对于其进行手动调整,只有这样是最快的方式。

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

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

相关文章

深度解析「前缀和」与「差分法」:高效算法的基石

深度解析前缀和与差分法:高效算法的基石 在计算机科学和数据处理领域,前缀和(Prefix Sum)与差分法(Difference Method)是两种基础且高效的算法技术。它们在处理数组的区间查询和区间修改操作时&#xff0c…

2-1 基本放大电路

放大的概念 mV →V mA→A 特征:放大功率(电压与电流)。 本质:能量在控制下的转换。(外接供电电源) 必要条件:有源元件(能量控制原件) 前提:不失真 测试的…

详解接口的常见请求方式

详解接口的常见请求方式 一、 常见接口请求方式1. GET2. POST3. PUT4. DELETE5. PATCH6. HEAD7. OPTIONS 二、 实现方法1. 前端实现2. 后端实现 三、 作用与主要区别四、 举例讲解1. 创建 Spring Boot 工程2. 添加依赖3. 编写 Controller 实现接口关键点说明 4. 启动与测试5. 总…

【附代码】【MILP建模】3D装箱问题(3D-Bin Packing Problem)

文章目录 相关教程相关文献问题描述建模思路——carton 方向平行轴建模方法(9变量6约束)平行轴建模方法(4变量8约束)枚举建模方法(6变量1约束) 建模思路——carton 位置平行轴建模方法枚举建模方法 Bin长宽…

【计算机网络中的奈氏准则与香农定理】

文章目录 一、前言二、奈氏准则1. 概念2. 奈氏准则公式3. 奈氏准则的意义 三、香农定理1. 概念2. 香农定理公式3. 香农定理的意义 四、奈氏准则与香农定理的对比五、应用示例1. 奈氏准则示例2. 香农定理示例 六、总结 一、前言 在计算机网络中,数据的传输速率与信道…

【C++】回调函数和回调对象

文章目录 回调可调用对象函数指针作回调函数对象作回调函数对象的使用std::function【C11】作回调使用 【C11】Lambda表达式作回调【C11】bind对象作回调std::bind的使用作回调使用 回调 当发生某种事件时需要调用或触发另一个事件即为回调,回调的核心即为将可调用…

DeepSeek助力文案,智能音箱如何改变你的生活?

你好,我是三桥君 你有没有为写智能音箱的宣传文案而抓耳挠腮过?三桥君在这方面可是有些感想,今天就来给你唠唠怎么用DeepSeek写出超赞的智能音箱宣传文案。 首先,你得给DeepSeek喂足“料”。这就好比做饭,你得准备好各…

【区块链安全 | 第一篇】密码学原理

文章目录 1.哈希函数1.1 哈希函数的性质1.2 常见哈希算法1.3 Merkle Tree(默克尔树)1.4 HMAC(哈希消息认证码) 2. 公钥密码学2.1 对称加密 vs 非对称加密2.2 RSA 算法2.3 ECC(椭圆曲线密码学)2.4 Diffie-He…

基于websocketpp实现的五子棋项目

该博客对于学完C和linux操作系统,但不知道如何用C开发项目,已经不知道C如何使用第三方库的人来说一定很有帮助,请耐心看完! 先看一下游戏会显示的前端界面,对理解这个游戏的前后端交互过程会有帮助 1. 开发环境 1.1 …

基于Redis分布锁+事务补偿解决数据不一致性问题

基于Redis的分布式设备库存服务设计与实现 概述 本文介绍一个基于Redis实现的分布式设备库存服务方案,通过分布式锁、重试机制和事务补偿等关键技术,保证在并发场景下库存操作的原子性和一致性。该方案适用于物联网设备管理、分布式资源调度等场景。 …

RK3568笔记八十: Linux 小智AI环境搭建

若该文为原创文章,转载请注明原文出处。 最近小智AI火了,韦老师出了 Linux 小智 AI 聊天机器人 版本,想移植到 RK3568上, 由于和韦老师硬件不同,所以需要交叉编译一些库,为后续移植做准备。 一、环境 1、…

C# SerialPort 使用详解

总目录 前言 在工业控制、物联网、嵌入式开发等领域,串口通信(Serial Port Communication)是连接串行设备(如条码扫描器、GPS接收器等)与计算机的重要手段。C# 提供了内置的 SerialPort 类,简化了串口开发…

3D点云的深度学习网络分类(按照作用分类)

1. 3D目标检测(Object Detection) 用于在点云中识别和定位目标,输出3D边界框(Bounding Box)。 🔹 方法类别: 单阶段(Single-stage):直接预测3D目标位置&am…

LabVIEW 与 PLC 通讯的常见方式

在工业自动化和数据采集系统中,PLC(可编程逻辑控制器) 广泛用于控制和监测各种设备,而 LabVIEW 作为强大的图形化编程工具,常用于上位机数据处理和可视化。为了实现 LabVIEW 与 PLC 的高效通讯,常见的方法包…

2025 polarctf春季个人挑战赛web方向wp

来个弹窗 先用最基础的xss弹窗试一下 <script>alert("xss")</script>没有内容&#xff0c;猜测过滤了script&#xff0c;双写绕过一下 <scrscriptipt>alert("xss")</scscriptript>background 查看网页源代码 查看一下js文件 类…

【Ai】--- 可视化 DeepSeek-r1 接入 Open WebUI(超详细)

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。【Ai】--- 可视化 DeepSeek-r1 接入 Open WebUI(超详细) 开发环境一、前情提要:你…

7.1-7.2考研408数据结构查找算法核心知识点深度解析

考研408数据结构查找算法核心知识点深度解析 一、查找基本概念 1.1 核心定义与易错点 查找表与关键字 易错点:混淆静态查找表(仅查询)与动态查找表(含插入/删除操作)的应用场景。例如哈希表属于动态查找结构,而分块查找适用于静态数据。难点:理解平均查找长度(ASL)的…

Redis--redis客户端

目录 一、引言 二、数据库管理命令 三、redis客户端 四、Java客户端使用Redis 五、相关命令使用 1.get&#xff0c;set 2.exists&#xff0c;del 3.keys 4.expire&#xff0c;ttl 六、总结 一、引言 在之前学了redis相关类型命令之后&#xff0c;本篇文章&#xff0c;…

SpringBoot3.0不建议使用spring.factories,使用AutoConfiguration.imports新的自动配置方案

文章目录 一、写在前面二、使用imports文件1、使用2、示例比对3、完整示例 参考资料 一、写在前面 spring.factories是一个位于META-INF/目录下的配置文件&#xff0c;它基于Java的SPI(Service Provider Interface)机制的变种实现。 这个文件的主要功能是允许开发者声明接口的…

鸿蒙特效教程10-卡片展开/收起效果

鸿蒙特效教程10-卡片展开/收起效果 在移动应用开发中&#xff0c;卡片是一种常见且实用的UI元素&#xff0c;能够将信息以紧凑且易于理解的方式呈现给用户。 本教程将详细讲解如何在HarmonyOS中实现卡片的展开/收起效果&#xff0c;通过这个实例&#xff0c;你将掌握ArkUI中状…