代码随想录算法训练营day76 | Floyd 算法精讲、A * 算法精讲

本次题目来自于卡码网

 ​​97. 小明逛公园 (Floyd 算法精讲)

1、确定dp数组以及下标的含义

grid[i][j][k] = m,表示 节点i 到 节点j 以[1...k] 集合为中间节点的最短距离为m

2、确定递推公式

分两种情况:

  • 节点i 到 节点j 的最短路径经过节点k
  • 节点i 到 节点j 的最短路径不经过节点k

对于第一种情况,grid[i][j][k] = grid[i][k][k - 1] + grid[k][j][k - 1]

第二种情况,grid[i][j][k] = grid[i][j][k - 1]

因为我们是求最短路,对于这两种情况自然是取最小值。

即: grid[i][j][k] = min(grid[i][k][k - 1] + grid[k][j][k - 1], grid[i][j][k - 1])

3、dp数组如何初始化

把k 赋值为 0,本题 节点0 是无意义的,节点是从1 到 n

初始化代码

vector<vector<vector<int>>> grid(n + 1, vector<vector<int>>(n + 1, vector<int>(n + 1, 10005)));  // C++定义了一个三位数组,10005是因为边的最大距离是10^4for(int i = 0; i < m; i++){cin >> p1 >> p2 >> val;grid[p1][p2][0] = val;grid[p2][p1][0] = val; // 注意这里是双向图
} 

grid数组中其他元素数值应该初始化多少呢? 本题求的是最小值,所以输入数据没有涉及到的节点的情况都应该初始为一个最大数。

4、确定遍历顺序

我们来看初始化,我们是把 k =0 的 i 和j 对应的数值都初始化了,这样才能去计算 k = 1 的时候 i 和 j 对应的数值。

这就好比是一个三维坐标,i 和j 是平层,而k 是 垂直向上 的。

遍历的顺序是从底向上 一层一层去遍历。

所以遍历k 的for循环一定是在最外面,这样才能一层一层去遍历

5、举例推导dp数组

if __name__ == '__main__':n, m = map(int, input().split())grid = [[[10005] * (n + 1) for _ in range(n + 1)] for _ in range(n + 1)]  # 因为边的最大距离是10^4for i in range(m):p1, p2, val = map(int, input().split())grid[p1][p2][0] = valgrid[p2][p1][0] = val  # 双向图# 开始 floydfor k in range(1, n + 1):for i in range(1, n + 1):for j in range(n + 1):grid[i][j][k] = min(grid[i][j][k - 1], grid[i][k][k - 1] + grid[k][j][k - 1])# 输出结果z = int(input())for _ in range(z):start, end = map(int, input().split())if grid[start][end][n] == 10005:print(-1)else:print(grid[start][end][n])

空间优化

我们可以做一下 空间上的优化,从滚动数组的角度来看,我们定义一个 grid[n + 1][ n + 1][2] 这么大的数组就可以,因为k 只是依赖于 k-1的状态,并不需要记录k-2,k-3,k-4 等等这些状态。

又由于本层计算中,使用了本层计算过的 grid[i][k] 和 grid[k][j] 是没问题的。那么就没必要区分,grid[i][k] 和 grid[k][j] 是 属于 k - 1 层的呢,还是 k 层的。

if __name__ == '__main__':n, m = map(int, input().split())grid = [[10005] * (n + 1) for _ in range(n + 1)]  # 因为边的最大距离是10^4for i in range(m):p1, p2, val = map(int, input().split())grid[p1][p2] = valgrid[p2][p1] = val  # 双向图# 开始 floydfor k in range(1, n + 1):for i in range(1, n + 1):for j in range(n + 1):grid[i][j] = min(grid[i][j], grid[i][k] + grid[k][j])# 输出结果z = int(input())for _ in range(z):start, end = map(int, input().split())if grid[start][end] == 10005:print(-1)else:print(grid[start][end])

126. 骑士的攻击 (A * 算法精讲)

加入了启发式函数,使用了优先队列,优先队列中自定义了比较函数(https://www.cnblogs.com/xrszff/p/14783972.html)

import heapq# F = G + H
# G = 从起点到该节点路径消耗
# H = 该节点到终点的预估消耗class Knight:def __init__(self):self.x = 0self.y = 0self.g = 0self.h = 0self.f = 0def __lt__(self, other):  # 自定义比较函数return self.f < other.fdef heuristic(k):  # 欧拉距离return (k.x - b1) * (k.x - b1) + (k.y - b2) * (k.y - b2)  # 统一不开根号,这样可以提高精度def astar(k):heapq.heappush(que, k)while que:cur = heapq.heappop(que)if cur.x == b1 and cur.y == b2:breakfor i in range(8):next = Knight()next.x = cur.x + dir[i][0]next.y = cur.y + dir[i][1]if next.x < 1 or next.x > 1000 or next.y < 1 or next.y > 1000:continueif moves[next.x][next.y] == 0:moves[next.x][next.y] = moves[cur.x][cur.y] + 1# 开始计算Fnext.g = cur.g + 5  # 统一不开根号,这样可以提高精度,马走日,1 * 1 + 2 * 2 = 5next.h = heuristic(next)next.f = next.g + next.hheapq.heappush(que, next)if __name__ == '__main__':dir = [(-2, -1), (-2, 1), (-1, 2), (1, 2), (2, 1), (2, -1), (1, -2), (-1, -2)]que = []heapq.heapify(que)n = int(input())for _ in range(n):a1, a2, b1, b2 = map(int, input().split())moves = [[0] * 1001 for _ in range(1001)]  # 每次重新开辟空间start = Knight()start.x = a1start.y = a2start.g = 0start.h = heuristic(start)start.f = start.g + start.hastar(start)while que:heapq.heappop(que)  # 队列清空print(moves[b1][b2])

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

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

相关文章

01 | 基础架构:一条SQL查询语句是如何执行的?

此系列文章为极客时间课程《MySQL 实战 45 讲》的学习笔记&#xff01; 引言 在了解 SQL 查询语句如何执行之前&#xff0c;先了解下MySQL 的基本架构示意图。 MySQL 分为 Server 层和引擎层。 Server 层包括连接器、查询缓存、分析器、优化器、执行器等&#xff0c;涵盖 M…

微球无菌筛分技术的巅峰之作:纳维加特PV系列

在医药行业中&#xff0c;对微球的制备和筛分要求极高&#xff0c;纳维加特&#xff08;Navector&#xff09;凭借其自主创新的PV系列微球无菌旋振筛&#xff0c;成功突破这一领域的技术壁垒。该产品不仅拥有高效率、高精度的筛分能力&#xff0c;同时还兼顾了高卫生级别的要求…

uniapp自动升级

一、创建云服务空间&#xff08;https://unicloud.dcloud.net.cn&#xff09; 云空间用于关联需要版本控制升级的项目&#xff0c;如果已拥有云空间则省略此步骤。 二、搭建 uni升级中心 - 后台管理系统&#xff08;升级中心 uni-upgrade-center - Admin&#xff09; uni-adm…

Linux调试器-gdb使用以及Linux项目自动化构建工具-make/Makefile

目录 1.gdb背景2.开始使用gdb3.make/makefile 背景4.实例代码5.依赖关系6.依赖方法7.原理8.项目清理 1.gdb背景 程序的发布方式有两种&#xff0c;debug模式和release模式 Linux gcc/g出来的二进制程序&#xff0c;默认是release模式 要使用gdb调试&#xff0c;必须在源代码生…

c++的makeFile怎么做

makeFile30分钟 1 介绍&#xff08;makeFile是什么&#xff0c;30分钟入门搞懂&#xff09;2 为什么要用makeFile3 如何制作makeFile文件&#xff1f;4 参考 makeFile真的很简单&#xff0c;不要想的一下子全都学懂了&#xff0c;先入门了&#xff0c;然后在实践中去使用&#…

Apache部署与配置

概述 介绍 Apache HTTP Server(简称Apache)是Apache的一个开源的网页服务器&#xff0c;它源自NCSAhttpd服务器&#xff0c;并经过多次修改和发展&#xff0c;如今已经成为全球范围内广泛使用的Web服务器软件之一 特点 跨平台&#xff1a;可以运行在几乎所有广泛使用的计算机平…

36 特殊类设计

类&#xff0c;不能被拷贝 拷贝只会放生在两个场景中&#xff1a;拷贝构造函数以及赋值运算符重载&#xff0c;因此想要让一个类禁止拷贝。 c98 将拷贝构造函数与赋值云悬浮重载只声明不定义&#xff0c;并且将其访问权限设置为私有 class CopyBan{// ...private:CopyBan(co…

Apache中使用SSI设置

先停服务在修改httpd.conf&#xff0c;备份下 Apache\Apache24\conf 设置httpd.conf LoadModule ssl_module modules/mod_ssl.so 取消该命令前的注释符# AddType text/html .shtml AddOutputFilter INCLUDES .shtml 取消该命令前的注释符# 加入html AddType text/html .…

在 Kotlin 中,`@JvmOverloads` 注解用于为具有默认参数值的函数生成重载方法

在 Kotlin 中&#xff0c;JvmOverloads 注解用于为具有默认参数值的函数生成重载方法。这个注解在你需要从 Java 代码调用 Kotlin 函数时特别有用&#xff0c;因为 Java 不支持默认参数值。 下面是一个例子&#xff0c;说明 JvmOverloads 的工作原理&#xff1a; Kotlin 代码…

前端javascript中的排序算法之插入排序

插入排序&#xff08;Selection Sort&#xff09;基本思想&#xff1a; 插入排序每次排一个数组项&#xff0c;以此方式构建最后的排序数组。假定第一项已经排序了&#xff0c;接着&#xff0c; 它和第二项进行比较&#xff0c;第二项是应该待在原位还是插到第一项之前呢&#…

软件工具网站推荐

1.菜鸟工具 菜鸟工具 - 不止于工具菜鸟工具&#xff0c;为开发设计人员提供在线工具&#xff0c;网址导航&#xff0c;提供在线PHP、Python、 CSS、JS 调试&#xff0c;中文简繁体转换&#xff0c;进制转换等工具。致力于打造国内专业WEB开发工具&#xff0c;集成开发环境&…

详细谈谈负载均衡的startupProbe探针、livenessProbe探针、readnessProbe探针如何使用以及使用差异化

文章目录 startupProbe探针startupProbe说明示例配置参数解释 使用场景说明实例——要求&#xff1a; 容器在8秒内完成启动&#xff0c;否则杀死对应容器工作流程说明timeoutSeconds: 和 periodSeconds: 参数顺序说明 livenessProbe探针livenessProbe说明示例配置参数解释 使用…

CSS技巧专栏:一日一例 1.纯CSS实现 会讨好的热情按钮 特效

题外话: 从今天开始,我准备开设一个新的专栏,专门写 使用CSS实现各种酷炫按钮的方法,本专栏目前准备写40篇左右,大概会完成如下按钮效果: 今天,我来介绍第一个按钮的实现方法:会讨好的热情按钮。为什么我给它起这样的名字呢?你看它像不像一个不停摇尾巴的小黄?当你鼠…

【QML之·基础语法概述】

系列文章目录 文章目录 前言一、QML基础语法二、属性三、脚本四、核心元素类型4.1 元素可以分为视觉元素和非视觉元素。4.2 Item4.2.1 几何属性(Geometry&#xff09;:4.2.2 布局处理:4.2.3 键处理&#xff1a;4.2.4 变换4.2.5 视觉4.2.6 状态定义 4.3 Rectangle4.3.1 颜色 4.4…

1Panel服务器面板支持哪些Linux操作系统?

1Panel面板支持的Linux操作系统版本有哪些&#xff1f;1Panel支持主流Linux发行版本&#xff0c;包括RedHat、CentOS、Ubuntu、Debian、openEuler及其他国产操作系统。支持多种服务器架构&#xff0c;码笔记整理详细1Panel面板支持的服务器系统、架构、内存和浏览器支持&#x…

【界面态】霍尔效应表征氮化对SiC/SiO2界面陷阱的影响

引言 引言主要介绍了硅碳化物&#xff08;SiC&#xff09;金属-氧化物-半导体场效应晶体管&#xff08;MOSFETs&#xff09;作为新一代高压、低损耗功率器件的商业化背景。SiC MOSFETs因其优越的电气特性&#xff0c;在高电压和高温应用领域具有巨大的潜力。然而&#xff0c;尽…

综合安全防护

题目 1,DMZ区内的服务器,办公区仅能在办公时间内(9:00-18:00)可以访问,生产区的设备全天可以访问. 2,生产区不允许访问互联网,办公区和游客区允许访问互联网 3,办公区设备10.0.2.10不允许访问DMz区的FTP服务器和HTTP服务器,仅能ping通10.0.3.10 4,办公区分为市场部和研发部,研…

Redis 数据过期及淘汰策略

Redis 数据过期及淘汰策略 过期策略 定时过期 在设置key​的过期时间的同时&#xff0c;为该key​创建一个定时器&#xff0c;让定时器在key​的过期时间来临时&#xff0c;对key进行删除。到过期时间就会立即清除。该策略可以立即清除过期的数据&#xff0c;对内存很友好&a…

动态数据库设计

动态数据库设计是一种灵活的方法&#xff0c;用于构建能够适应不断变化的数据需求的数据库结构。它强调在不频繁修改数据库表结构的前提下&#xff0c;有效管理和存储多样化的数据。以下是实现动态数据库设计的一些关键技术点和策略&#xff1a; 实体-属性-值&#xff08;EAV&a…

Rockchip RK3588 - Rockchip Linux SDK脚本分析

---------------------------------------------------------------------------------------------------------------------------- 开发板 &#xff1a;ArmSoM-Sige7开发板eMMC &#xff1a;64GBLPDDR4 &#xff1a;8GB 显示屏 &#xff1a;15.6英寸HDMI接口显示屏u-boot &a…