当前位置: 首页 > news >正文

leetcode787. K 站中转内最便宜的航班——优先队列优化的Dijkstra算法+剪枝

题目

leetcode787. K 站中转内最便宜的航班

题目分析

给定一个城市图,每个城市通过航班与其他城市相连。每个航班都有一个起点、终点和价格。你需要找到从起点城市 src 到终点城市 dst 的最便宜路径,但这条路径最多只能经过 k 个中转站。你需要返回这种路径的最低价格,如果不存在这样的路径,则返回 -1。

输入:

n:城市的数量
flights:航班的列表,每个航班用 [fromi, toi, pricei] 表示,表示从城市 fromi 到城市 toi 的航班价格为 pricei
src:起点城市
dst:终点城市
k:最多经过的中转站数

输出:

最便宜的价格,如果没有满足条件的路径,则输出 -1

思路分析

我看到这道题第一时间想的就是dijkstra算法,因为我也不会别的算法。
对于k的限制,我想到可以在优先队列中维护一个当前层级的变量,当到达的层级大于k时,就不再扩展了。

但是我没考虑到k的限制可能会导致最短路径无法达成,并且由于dijkstra算法的性质,其他路线也被直接丢弃了

于是我尝试不使用visited数组记录访问过的节点,将每个节点的后继节点都加入队列中,只有层级大于k时,才会跳过。此时算法退化成了变体的广度优先搜索算法,会搜索每一条在中转数在k内的路径。

但是,当数据量大了之后,显然这个算法会超时。

继续思考,发现dijkstra算法找到的是最优路径,但是其中转节点可能很多,而真正的路径只可能在中转节点比最优路径少的路径里,其他中转节点多于最优路径的路径完全可以剪枝,因为他们的费用不可能更低。

按照这个思路,只需要维护一个每个节点的最小中转数,任何多于最小中转数的路径都可以剪枝,因为对于每一个被剪枝的路径来说,在其之前都已经有至少一条路径价格比它低的同时中转数还要小于它

代码

class Solution:def findCheapestPrice(self, n: int, flights: List[List[int]], src: int, dst: int, k: int) -> int:# 建立邻接表maps=[[]  for _ in range(n)]for edge in flights:maps[edge[0]].append(edge[1:])#最小堆模拟优先队列,(价格,节点编号,层级)pq=[(0,src,0)]#当前每个节点的中转数记录visit=[n+1]*nwhile pq:w,p,c=heappop(pq)#过滤超过层级k的节点,剪枝中转城市多余当前节点记录的点if c>=visit[p] or c>k+1:continueif  p == dst:return w# 直接等就可以,比它大的到不了这一步visit[p]=c# 将后继节点加入优先队列for point in maps[p]:heappush(pq,(w + point[1],point[0],c+1))return  -1

提交

一直交刷成绩QAQ
在这里插入图片描述


2024/8/8

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【C#】计算多边形的面积
  • Redis的面试题
  • 数据类型练习
  • 25-原理图BOM的输出
  • 智慧宠物护理:智能听诊器引领健康监测新潮流
  • 利用 Docker 和 Poetry 优化 Python 应用部署
  • 鸿蒙(API 12 Beta3版)【时域可分层视频编码】 音视频编码
  • YOLOv8改进 | 主干网络 | 用EfficientNet卷积替换backbone【教程+代码 】
  • Python爬虫:下载4K壁纸
  • 六、go函数
  • 我与数据库的七年之痒:从初识到没它不行
  • Hive SQL ——窗口函数源码阅读
  • C++第一讲:开篇
  • LVS(Linux Virtual Server)负载均衡详解
  • PC端与移动端皆可用的在线3D模型评审预览工具,随时随地掌握细节
  • JavaScript 如何正确处理 Unicode 编码问题!
  • Debian下无root权限使用Python访问Oracle
  • E-HPC支持多队列管理和自动伸缩
  • Javascript基础之Array数组API
  • Java超时控制的实现
  • Mybatis初体验
  • SQL 难点解决:记录的引用
  • vue-router 实现分析
  • 包装类对象
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 对象引论
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 后端_ThinkPHP5
  • 老板让我十分钟上手nx-admin
  • 前端_面试
  • 通过git安装npm私有模块
  • 物联网链路协议
  • 云大使推广中的常见热门问题
  • 怎么把视频里的音乐提取出来
  • Python 之网络式编程
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 阿里云移动端播放器高级功能介绍
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 大数据全解:定义、价值及挑战
  • ​flutter 代码混淆
  • ​马来语翻译中文去哪比较好?
  • (20)docke容器
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (转载)CentOS查看系统信息|CentOS查看命令
  • **PHP分步表单提交思路(分页表单提交)
  • .bat批处理(六):替换字符串中匹配的子串
  • .jks文件(JAVA KeyStore)
  • .mysql secret在哪_MYSQL基本操作(上)
  • .Net CF下精确的计时器