代码随想录算法训练营第62天|Floyd 算法精讲、A * 算法精讲 (A star算法)

news/2024/9/18 10:23:54/ 标签: 算法

打卡Day62

1.Floyd 算法精讲

题目链接:Floyd 算法精讲
文档讲解: 代码随想录

本题是多源最短路,即求多个起点到多个终点的多条最短路径。Floyd算法对边的权值正负没有要求,都可以处理,其核心思想是动态规划。
动规五部曲:
(1)确定dp数组和下标
用grid存图,grid[i][j][k]表示节点 i 到节点 j 以[1,…,k] 集合为中间节点的最短距离
(2)递推关系式
分两种情况,一种是节点 i 到节点 j 的最短路径经过节点 k,grid[i][j][k] = grid[i][k][k-1] + grid[k][j][k-1];另一种情况,节点 i 到节点 j 的最短路径不经过节点 k,grid[i][j][k] = grip[i][j][k-1];两者取最小值
(3)初始化
刚开始初始化 k 是不确定的,如果赋值为1,那么不能知道节点 i 到节点 j 经过1个节点的最短距离,所以只能把 k 赋值为0,本题中节点0是无意义的,节点是从1到n。本题求的是最小值,所以其余值初始化为最大值
(4)遍历顺序
好比三维坐标,i,j是平层,而k是垂直向上的,遍历顺序是从底向上一层一层去遍历,所以遍历时 k 的for循环一定在最外面,这样才能一层一层去遍历,而 i 和 j 的先后顺序无所谓
(5)打印数组

#基于三维数组
n,m = map(int,input().split())
#创建三维数组
grid = [[[float('inf')] * (n+1) for _ in range(n+1)] for _ in range(n+1)]
#初始化
for _ in range(m):u,v,w = map(int,input().split())grid[u][v][0] = w grid[v][u][0] = w 
#floyd
for k in range(1,n+1):for i in range(1,n+1):for j in range(1,n+1):grid[i][j][k] = min(grid[i][j][k-1],grid[i][k][k-1] + grid[k][j][k-1])
#输出结果
q = int(input())
for _ in range(q):start,end = map(int,input().split())if grid[start][end][n] == float('inf'):print(-1) else:print(grid[start][end][n])
#基于二维数组
n,m = map(int,input().split())
grid = [[float('inf')] * (n+1) for _ in range(n+1)]
#初始化
for _ in range(m):u,v,w = map(int,input().split())grid[u][v] = w grid[v][u] = w 
for k in range(1,n+1):for i in range(1,n+1):for j in range(1,n+1):grid[i][j] = min(grid[i][j],grid[i][k] + grid[k][j])
#输出结果
q = int(input())
for _ in range(q):start,end = map(int,input().split())if grid[start][end] == float('inf'):print(-1)else:print(grid[start][end])

2.A * 算法精讲 (A star算法

题目链接:A * 算法精讲 (A star算法
文档讲解: 代码随想录

bfs是没有目的性的一圈一圈搜索,而A*算法是有方向性的去搜索,通过启发式函数指引搜索方向。本题的图是无权网络状,使用欧氏距离来计算权值,对队列里的节点进行排序。

import heapq
direction = [[-2,1],[-1,2],[1,2],[2,1],[2,-1],[1,-2],[-1,-2],[-2,-1]]
maxx = 1001
#定义骑士类
class Knight:def __init__(self,x,y,g,h):self.x = xself.y = yself.g = g #从起点到该点的距离self.h = h #从该点到终点的距离self.f = g + hdef __lt__(self,other):return self.f < other.f #小顶堆,按照f排序,统一不开根号可以提高精度
#计算欧式距离
def heuristic(k,b1,b2):return (k.x - b1) ** 2 + (k.y - b2) ** 2 
def astar(start_x,start_y,end_x,end_y):#记录路径长度move = [[0] * maxx for _ in range(maxx)]que = []start = Knight(start_x,start_y,0,heuristic(Knight(start_x,start_y,0,0),end_x,end_y))heapq.heappush(que,start)while que:cur = heapq.heappop(que)#终止条件,达到终点if cur.x == end_x and cur.y == end_y:return move[cur.x][cur.y]for dx,dy in direction:next_x = cur.x + dx next_y = cur.y + dy if 1 <= next_x < maxx and 1 <= next_y < maxx and move[next_x][next_y] == 0:move[next_x][next_y] = move[cur.x][cur.y] + 1 #走马日,1**2+2**2=5next_k = Knight(next_x,next_y,cur.g + 5,heuristic(Knight(next_x,next_y,0,0),end_x,end_y))heapq.heappush(que,next_k) return -1
n = int(input())
for _ in range(n):a1,a2,b1,b2 = map(int,input().split())res = astar(a1,a2,b1,b2)print(res)

A算法搜的路径如何,完全取决于启发式函数怎么写,不能保证一定是最短路,设计启发式函数时要考虑时间效率和准确度之间的权衡。该算法的缺陷:A只从队列里取出距离终点最近的节点,大量不需要访问的节点都在队列里,会造成空间的过度消耗;有种常见是解决不了的,给出多个可能的目标,然后在多个可能目标中选择最近的节点,A*算法只擅长给出明确的目标然后找到最短路径。


http://www.ppmy.cn/news/1517172.html

相关文章

sophon bm1684x 运行qwen2

1、用户名/密码 登录 linaro linaro2、删除安装文件 sudo mv /var/lib/dpkg/info/wps-office.* /tmp3、更新 sudo apt-get update sudo apt-get upgrade4、Qwen2实例 LLM-TPU-main.zip /data/LLM-TPU-main/models/Qwen2/python_demo5、安装依赖 pip3 install transformers…

Nginx: 代理场景下Nginx接收用户请求包体的处理

Nginx 反向代理图 当用户发过来一个request body的时候&#xff0c;Nginx 是如何处理这样一个body这个body 它对应的就是我们客户请求的一些具体内容 1 &#xff09;proxy_request_bufering 指令 接收包体的两种方式 接收完全部包体再发送一边接收包体一边发送 接收包体的两种…

Android 息屏录音

问题 解决Android录音的息屏之后无法录制声音的问题&#xff0c;看日志发现&#xff0c;录音程序并没有中断&#xff0c;但是录制到的数据均是byte为0的数据&#xff0c;即空数据。 测试机为Android 13系统 废话 网上一搜一大堆&#xff0c;ai也是一问也回答得头头是道&…

【Selenium】UI自动化实践——输入验证码登录

文章目录 实战题目解题方案 实战题目 使用pythonselenium实现输入验证码的UI自动化。登录页面如图&#xff1a; 解题方案 验证码登录需要导入相关模块和库&#xff0c;本文使用的是opencv和ddddocr模块组合&#xff0c;导入方式采用pip3 install opencv-python、pip3 insta…

速盾:cdn是什么发展前景?

CDN&#xff08;Content Delivery Network&#xff09;是内容分发网络的缩写&#xff0c;是一种通过将内容存储在离用户最近的服务器上&#xff0c;以提高网站访问速度和内容可用性的技术。CDN的发展前景非常广阔&#xff0c;下面将从技术进步、用户需求和商业价值三个方面来详…

如何满足业主多元需求?开发物业APP,打造智能社区生活

随着智能科技的快速发展&#xff0c;物业管理也逐渐迈入数字化时代。物业app开发成为了提升社区管理效率、改善居民生活质量的重要途径&#xff0c;许多物业管理公司纷纷开发物业App&#xff0c;以提升管理效率、改善用户体验。一款出色的物业APP能够整合居民需求、提升企业服务…

如何选择开放式耳机?2024五大市场热卖推荐

在嘈杂的环境中&#xff0c;选择一款合适的耳机可以让我们既享受音乐又能保持对周围环境的警觉。开放式耳机因其设计特点&#xff0c;允许声音通过空气振动传播&#xff0c;不堵塞耳道&#xff0c;这样既保证了佩戴的舒适性&#xff0c;又能让我们感知周围的声音&#xff0c;提…

探索微服务架构中的动态服务发现与调用:使用 Nacos 与 Spring Cloud OpenFeign 打造高效订单管理系统

1. 背景 在现代微服务架构中&#xff0c;服务之间的通信与协作是非常重要的。Spring Cloud Alibaba 提供了一套完整的微服务解决方案&#xff0c;其中包括 Nacos 用于服务注册与发现&#xff0c;OpenFeign 用于声明式服务调用&#xff0c;Spring Cloud LoadBalancer 用于负载均…

基于asp.net的茶叶销售系统网站附源码

这个一个基于asp.net的webform框架的茶叶销售系统源码&#xff0c;包含前后台&#xff0c;具体详情如下 1.主要功能 主要功能包含用户注册、茶叶浏览、我的购物车、购物订单、商品评论、个 人中心、后台登录、用户管理、商品管理、订单管理、评论管理、发布商品 等等模块。2.…

从国产 3A 大作《黑神话·悟空》的横空出世,深入分析国产游戏在图形渲染、物理引擎、AI等方面的技术亮点,以及这些技术如何推动了游戏体验的提升

深入分析国产游戏在图形渲染、物理引擎、AI等方面的技术亮点&#xff0c;以及这些技术如何推动了游戏体验的提升。 一、图形渲染技术在游戏行业的进步显著推动了视觉效果的提升&#xff0c;增强了玩家的沉浸感。以下是图形渲染领域的一些重要技术及其对游戏体验的影响&#xff…

DORIS - 执行 git submodule update --init --recursive 的目的是什么?

前言 以前&#xff0c;我们学习源码的时候只需要执行克隆命令即可&#xff0c;如下&#xff1a; git clone https://github.com/rocky/doris.git 当我学习DORIS的时候&#xff0c;发现执行完上面的命令后&#xff0c;还需要执行如下命令: git submodule update --init --recur…

[论文笔记]Improving Retrieval Augmented Language Model with Self-Reasoning

引言 今天带来一篇百度提出的关于提升RAG准确率的论文笔记&#xff0c;Improving Retrieval Augmented Language Model with Self-Reasoning。 为了简单&#xff0c;下文中以翻译的口吻记录&#xff0c;比如替换"作者"为"我们"。 检索增强语言模型(Retrie…

linux常见基础命令

Linux基础命令 (下面这些命令都是最常见的命令.更复杂的会在之后的C语言学习陆续深入) 1、 pwd 功能&#xff1a; print work directory的缩写&#xff0c;显示当前目录的绝对路径 2、 cd 功能&#xff1a; change directory的缩写&#xff0c;切换目录 绝对路径&#xff1a;以…

【KDD2024】大数据基础工程技术集群异常检测论文入选

近日&#xff0c;由阿里云计算平台大数据基础工程技术团队主导&#xff0c;与浙江大学合作的论文《Cluster-Wide Task Slowdown Detection in Cloud System》被数据挖掘领域顶会ACM SIGKDD2024接收&#xff0c;该论文从集群整体作业执行情况分布入手&#xff0c;旨在解决集群整…

服务器被渗透的表现及检测方法

本文将详细介绍服务器遭受渗透攻击后的常见症状&#xff0c;并提供一些实用的检测方法。我们还将通过具体的案例和代码示例来帮助读者更好地理解和检测服务器的安全状况。 1. 引言 服务器渗透是指攻击者未经授权访问服务器资源的过程。一旦服务器被成功渗透&#xff0c;可能会…

pgsql导入导出数据

1、pg_dump 进行数据库导出 导出数据库表结构和数据 pg_dump -U postgres -h localhost -d mydatabase -f /path/to/backup.sql-U 用户名-h 主机地址-d 要导出的数据库-f 导出的sql文件 2、pg_dumpall 备份所有数据库 pg_dumpall -U postgres -h localhost -f /path/to/all…

java框架基础--反射

前言 本文将详细讲述反射的基本概念以及反射底层代码的部分实现 反射 就是程序在运行状态时,对于任何一个类,都在仅知道类名的状况下,动态获取该类中的所有属性和方法(包括私有),可以动态地通过该类的对象调用类的属性和方法的机制称为反射机制 是将java中的类映射成一个个对象…

MAVEN 3.9.1安装

WIN系统MAVEN 3.9.1安装 1. 下载 下载官网地址&#xff1a;Index of /dist/maven/maven-3 (apache.org) 百度网盘&#xff1a; 通过网盘分享的文件&#xff1a;apache-maven-3.9.1-bin.zip 链接: https://pan.baidu.com/s/1VKmxrU5Hg6mbEUc43wjQUw 提取码: aua6 –来自百度网…

Linux 常用命令 - lsblk 【查看磁盘(块设备)使用情况】

简介 lsblk 源自于 “list block devices” 的缩写。这个命令用于列出系统中的所有块设备&#xff08;block devices&#xff09;&#xff0c;比如硬盘、光驱等。它展示块设备的层次结构、大小和挂载点等信息&#xff0c;非常有助于系统管理员理解系统存储结构。 使用方式 l…

Spring:浅谈对SpringBean的认识

一、SpringBean的生命周期 1、实例化bean对象&#xff1a;通过反射的方式进行对象的创建&#xff0c;此时的创建只是在堆空间中申请空间&#xff0c;属性都是默认值。 2、设置对象属性&#xff1a;给对象中的属性进行值的设置工作。 3、检查Aware相关接口并设置相关依赖&#x…