数据结构与算法-图论-最短路和其他的结合

介绍

最短路算法常与深度优先搜索(DFS)、动态规划(DP)、二分答案、拓扑排序等算法结合使用:

- 最短路与DFS结合:在一些图的路径问题中,当需要访问特定的多个结点,且数据范围较小时,可使用DFS。例如在一个有(n)个结点、(m)条无向边的图中,有(x)个结点必须访问,求最短路径。此时问题可转化为如何排列这(x)个结点,使得从起始结点依次经过其余结点所经过的路径最短。由于DFS时间复杂度较高,一般先用Dijkstra算法对这(x)个结点间的最短路做预处理,然后用DFS进行结点排列尝试,时间复杂度约为(O(ntimes ntimeslog(m)))。

- 最短路与DP结合:在涉及路径选择和最优值求解,且问题具有最优子结构性质时,会结合DP。比如在一个图中,从起点到终点的过程中,在不同的结点有不同的花费或收益,同时路径存在一定的限制条件,要求找到能获取最大收益或最小花费的路径。可以用DP来记录每个状态(到达某个结点的情况)下的最优值,用最短路算法来确定路径的可达性和距离信息,二者相互配合求解。

- 最短路与二分答案结合:当问题是求解使得某一条件满足的最优值(如路径中第(k)大的边最小)时,且该最优值存在二段性(即大于该值的情况和小于该值的情况有明显区分),可以使用二分答案的方法。通过二分枚举可能的最优值,然后利用最短路算法来判断在该值下是否满足题目条件(如查找该路径中有多少条边的权重大于枚举值),从而逐步缩小范围找到最优解。

- 最短路与拓扑排序结合:在处理有向无环图(DAG)且存在边权(可正可负)的最短路问题时,常结合拓扑排序。例如有多块区域通过道路(边权大于(0))和航线(边权可正可负,单向)相连,求最短路。由于存在负权边,不能直接用Dijkstra算法。此时先对区域间的道路用Dijkstra算法处理,对于航线,利用拓扑排序得到拓扑序,根据该顺序计算各个区域间的最短路,这样能有效处理负权边和有向图的情况。

新年好(dfs+最短路)

分析:


这道题可以结合深度优先搜索(DFS)和 SPFA(Shortest Path Faster Algorithm)算法来求解,以下是具体分析:

算法思路

图的存储:使用邻接表来存储图的结构,对于每个车站(节点),记录与其相连的车站以及通过公路所需的时间(边的权重)。

SPFA 求单源最短路径:从车站 1 出发,利用 SPFA 算法计算到车站 a, b, c, d, e 的最短路径。SPFA 算法基于队列实现,不断更新到各个节点的最短距离。初始时,将起点的距离设为 0,其他节点设为无穷大。每次从队列中取出一个节点,更新其相邻节点的距离,如果某个节点的距离被更新且该节点不在队列中,则将其加入队列。重复此过程,直到队列为空。

DFS 进行路径搜索:在得到从车站 1 到各个亲戚所在车站的最短距离后,使用 DFS 来枚举所有可能的拜访顺序。从车站 1 出发,依次选择一个未访问过的亲戚所在车站进行访问,记录路径长度,当访问完所有亲戚所在车站后,再返回车站 1,计算总路径长度。通过比较所有可能路径的总长度,找出最短的那一条。

伪代码:

2:通信线路(二分+最短路):

分析:


这道题可以通过二分答案和最短路算法来求解,以下是详细分析:

算法思路

1. 二分答案:由于要找的是完成升级的最少花费,而这个花费是路径上剩余电缆中最贵的那条的价格,所以可以对这个价格进行二分。价格的范围是从 (1) 到所有电缆升级花费中的最大值 (L_{max})。每次二分一个价格 (mid),判断是否存在一条从 (1) 号基站到 (N) 号基站的路径,在这条路径上不超过 (K) 条电缆的花费大于 (mid)。如果存在这样的路径,说明可以尝试更小的价格;如果不存在,则需要增大价格。

2. 判断路径是否存在(最短路算法):在二分过程中,对于每个假设的价格 (mid),需要判断是否存在满足条件的路径。这里可以使用最短路算法(如迪杰斯特拉算法或SPFA算法)进行改造。将花费大于 (mid) 的电缆看作权重为 (1)(表示这条电缆是需要额外付费考虑的),花费小于等于 (mid) 的电缆看作权重为 (0)。然后求从 (1) 号基站到 (N) 号基站的最短路,如果最短路的权重小于等于 (K),则说明存在满足条件的路径。

伪代码:

3-道路与航线(拓扑排序+最短路):

分析:


一种很巧妙的解题思路,利用连通块、拓扑排序和迪杰斯特拉算法结合来求解从发送中心城镇 (S) 到每个城镇的最便宜方案

算法思路

1. 划分连通块: - 仅考虑道路(因为道路是无向且可构成连通区域),使用深度优先搜索(DFS)或并查集算法来标记每个城镇所属的连通块。通过遍历所有道路,将相互连通的城镇划分到同一个连通块中,这样可以把整个图按道路连通性划分为若干个连通块。 - 记录每个连 通块包含的城镇节点。

2. 构建连通块之间的拓扑图: - 考虑航线,对于每条航线 ( (u, v) ) ,找到 (u) 和 (v) 所属的连通块 (block_u) 和 (block_v) 。如果 (block_u neq block_v) ,则在连通块之间构建一条有向边 ( (block_u, block_v) ) ,并记录这条边对应的航线信息(如花费等)。同时,记录每个连通块的入度(即指向该连通块的有向边数量)。 - 由于题目条件保证航线构成的图无环,所以这些连通块之间的有向边也构成一个有向无环图(DAG)。

3. 拓扑排序与迪杰斯特拉结合: - 把入度为 (0) 的连通块入队,开始拓扑排序。 - 对于每个连通块,先在其内部使用迪杰斯特拉算法,计算该连通块内从属于该连通块且是发送中心城镇 (S) 所在的节点(如果 (S) 在该连通块内)到其他节点的最短路径。 - 当处理一个连通块时,检查从该连通块出发的航线(即连通块之间的有向边),对于每条航线对应的目标连通块,如果目标连通块的入度减为 (0) ,则将其入队。同时,根据航线的花费,更新目标连通块内节点的最短距离(如果通过这条航线能使距离更短)。 - 重复上述步骤,直到队列为空,此时得到的就是从 (S) 到各个城镇的最短距离。

伪代码:

4最优贸易:

分析:

这种利用跑正反两次 SPFA 算法的思路是很巧妙的,下面详细分析其原理、实现步骤以及复杂度:

思路原理:

正向 SPFA:从 1 号城市出发,使用 SPFA 算法遍历所有能到达的城市。在遍历过程中,记录从 1 号城市到每个城市 k 路径上经过的所有城市中水晶球价格的最小值,存放在 dmin[k] 中。这样就能得到从起点 1 号城市到各个可达城市路径上的最低买入价格。

反向 SPFA:将图中的边方向全部反向(或者在实现时以相反的逻辑处理),从 n 号城市出发再次使用 SPFA 算法。这次记录从 n 号城市到每个城市 k 路径上经过的所有城市中水晶球价格的最大值,存放在 dmax[k] 中 。也就是得到了从各个城市到终点 n 号城市路径上的最高卖出价格。

计算结果:通过遍历所有城市 k,计算 dmax[k] - dmin[k],取其中的最大值就是在从 1 号城市出发到 n 号城市的过程中,进行最多一次买卖水晶球能赚取的最大旅费。如果所有的差值都小于等于 0,则表示赚不到差价。

伪代码:

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

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

相关文章

AOP基础-01.快速入门

一.AOP 对于统计每一个业务方法的耗时这一操作,如果再业务层的每一个方法前获取方法运行的开始时间,方法结束获取结束时间,然后计算执行耗时,那这样就太繁琐了。能不能定义一个模板方法,使得该方法能够在业务层的方法执…

【笔记】redis回忆录(未完 重头过一遍)

了解 redis在linux上运行 没有window版本 有也是微软自己搞的 (一)安装与修改配置 1.在linux虚拟机上 安装gcc依赖 然后再usr/local/src解压在官网下载好的redis安装包 直接拖进去 tar -zxvf 安装包名字 tab键补齐 解压成功 进入软件 并执行编译命令…

Android OpenGLES2.0开发(十一):渲染YUV

人生如逆旅,我亦是行人 Android OpenGLES开发:EGL环境搭建Android OpenGLES2.0开发(一):艰难的开始Android OpenGLES2.0开发(二):环境搭建Android OpenGLES2.0开发(三&am…

deep-research 专用评测数据集

Deep Research自2025年2月初由OpenAI推出后迅速引发全球关注,其通过端到端强化学习技术实现多步骤研究任务自动化,能在数十分钟内生成分析师水平报告,效率远超人类(耗时从30分钟到30天不等),被学者评价为“…

SQL之order by盲注

目录 一.order by盲注的原理 二.注入方式 a.布尔盲注 b.时间盲注 三.防御 一.order by盲注的原理 order by子句是用于按指定列排序查询结果,列名或列序号皆可。 order by 后面接的字段或者数字不一样,那么这个数据表的排序就会不同。 order by 盲…

基于javaweb的SSM+Maven疫情物业系统设计和实现(源码+文档+部署讲解)

技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

提升数据洞察力:五款报表软件助力企业智能决策

概述 随着数据量的激增和企业对决策支持需求的提升,报表软件已经成为现代企业管理中不可或缺的工具。这些软件能够帮助企业高效处理数据、生成报告,并将数据可视化,从而推动更智能的决策过程。 1. 山海鲸报表 概述: 山海鲸报表…

IP-------GRE和MGRE

4.GRE和MGRE 1.应用场景 现实场景 居家工作,公司工作,分公司工作----------需要传输交换数据--------NAT---在该场景中需要两次NAT(不安全) 为了安全有两种手段-----1.物理专线---成本高 2.VPN--虚拟专用网---隧道技术--封装技…

音乐游戏Drummania(GITADORA)模拟器

文章目录 (一)Drummania和GITADORA(1.1)基本情况(1.2)机体 (二)模拟器(2.1)主程序(2.2)模拟器主题 (三)曲谱文…

gotool在线工具集

1. 包含各种 sql 处理 2. 包含 json 处理 3. 包含 图片处理 4. 跨平台传输 gotool

点击修改按钮图片显示有问题

问题可能出在表单数据的初始化上。在 ave-form.vue 中,我们需要处理一下从后端返回的图片数据,因为它们可能是 JSON 字符串格式。 vue:src/views/tools/fake-strategy/components/ave-form.vue// ... existing code ...Watch(value)watchValue(v: any) …

绩效管理与业务流程

绩效管理本质就是价值管理,或者说是能力管理,也就是通过一系列的科技手段去发现、证明一个人的能力和价值,然后给予科学、合理的利益分配。业务流程就是把企业的每一个零部件或者说齿轮都有效组合起来形成一个有机体为市场提供自己的独特价值…

Nginx处理http的流程

文章目录 前言一、发版本后旧版本可以用项目基本情况Nginx 配置**解释每一行的作用:****表现和行为:****适用场景**:资源的缓存策略 在这里插入图片描述 二, nginx处理http的流程Nginx 的 GitHub 源码地址 **Nginx 核心源码解读&a…

QT各种版本下载安装

参考链接: 【Qt】超详细!Qt4.8.6和VS2010的配置及使用 由于QT官网一般现在进不去,所以下载一些QT版本只能通过镜像或者以前下载存储的安装包来进行,现在推荐两种方法 从参考链接中搬过来: 方案一:国内镜…

【STM32H743IIT6】STM32H7的ADC时钟频率设置问题 —— 网上大多文章未注意到的要点!

前言 我使用的是定时器触发ADC采样。最近在想达到ADC的最高采样率的时候,发现一直却卡在1Msps上不去,直到在硬汉嵌入式的论坛里才发现了答案:[ADC] STM32H743/H750的Y版和V版芯片ADC的主频区别 这篇文章就详细的讲一下这个问题,这…

2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(四)

2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(四) 第一部分:网络平台搭建与设备安全防护任务书第二部分:网络安全事件响应、数字取证调查、应用程序安全任务书任务 1:应急响应&…

touchgfx的工作机制

touchgfx的工作机制 一.MVP软件架构 MVP的全称为Model-View-Presenter Model: 就是数据部分,在整个touchgfx应用中,只有一个Model类实例对象,它为所有的Screen屏幕界面服务,可以理解成是一个全局变量区,同时它还负责和后端系统通信 View: 就是UI界面部分,对应于View类,在整…

在 Ansys Mechanical 中解决干涉拟合

有意和无意的过盈配合在工程设计和有限元分析 (FEA) 中很常见。当两个组件重叠或接触时,就会发生这种情况,从而产生应力和变形,必须仔细分析以确保功能正常。有意干涉,例如轴和轴承之间的压配合或用于固定金…

Linux设备驱动开发-SPI驱动开发详解(包含设备树处理详细过程)

基础知识及 SPI 相关结构体介绍 引脚:MISO(master 输入,slave 输出),MOSI(master 输出,slave 输入),片选引脚,SCK(时钟) 控制寄存器&…