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

news2024/9/20 0:58:59

题目

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]*n
        while pq:
            w,p,c=heappop(pq)
            #过滤超过层级k的节点,剪枝中转城市多余当前节点记录的点
            if c>=visit[p] or c>k+1:
                continue
            if  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

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

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

相关文章

构建智能生态,视频监控/安防监控EasyCVR视频汇聚流媒体技术在智能分析领域的应用

随着5G、AI、物联网(IoT)、云计算等技术的快速发展,万物互联的时代已经到来,全新的行业生态AIoT正在引领一场深刻的变革。在这场变革中,EasyCVR视频流媒体技术以其强大的视频处理、汇聚与融合能力,在智能分…

2024年计算机类学术会议有哪些

随着科技的飞速发展,计算机科学与技术领域正以前所未有的速度进步,各类学术会议成为了交流最新研究成果、探讨前沿技术趋势的重要平台。2024年,全球范围内将举办多场计算机类学术会议,这些会议不仅汇聚了顶尖的专家学者&#xff0…

创客匠人老蒋:你缺的不是客户,缺的是单个客户的营销和变现能力

老蒋创客圈第58期对话标杆直播连麦,我们邀请到【拾才易人】平台创始人侯邦辉老师。侯老师与创客匠人合作3年之久,实现了线上线下高转化,并实现家庭教育、心理疗愈、国学传承与营销运营一站式学习平台。 上篇文章,我们主要梳理了连…

Gemma Scope 帮助理解 AI 模型的内部工作原理

Gemma Scope 工具如何帮助理解 AI 模型(具体来说是 Gemma 模型)的内部工作原理,通过观察模型的“特征”来理解 AI 是如何“思考”的 1 特征(features) 了解AI模型在思考什么。Gemma Scope 将 Gemma 模型的大脑分解成…

延时队列与redis and rabbitmq

延时队列是什么 延时队列(Delay Queue)是一种特殊的消息队列,它允许你在添加消息时设置一个延时时间,消息只有在延时时间到达后才能被消费。这种机制在分布式系统中非常有用,常用于处理需要在指定时间后执行的任务&am…

光耦合器知识概述

光耦合器,又称光电耦合器,是一种通过光信号来实现电信号隔离的电子元件。它在确保电路安全和信号完整性方面起着关键作用,广泛应用于电源管理、工业自动化、消费电子等领域。本文将深入探讨光耦合器的工作原理、技术参数、应用场景、选型指南…

【JAVA入门】Day19 - BigInteger 和 BigDecimal

【JAVA入门】Day19 - BigInteger 和 BigDecimal 文章目录 【JAVA入门】Day19 - BigInteger 和 BigDecimal一、BigInteger1.1 BigInteger 构造方法1.2 BigInteger 内部常见方法 二、BigDecimal2.1 BigDecimal 的作用2.2 BigDecimal 对象的获取2.3 BigDecimal 中常见的成员方法2.…

自动驾驶计算芯片企业“流血”上市,小米、腾讯等曾投7亿美元

"自动驾驶市场何时迎来爆发?" 作者 | 魏 强 编辑 | 卢旭成 今天,自动驾驶计算芯片企业Black Sesame International HoldingLimited(黑芝麻智能)在港交所上市,发行价28港元,募资总额10.36亿港元。 黑芝麻智能号称国…

牛客周赛 Round 54 (个人题解)(待补全)

前言: 如今已经回到返校回家,在家中的学习热情明显下降,在加上练车、和朋友亲戚聚一聚,学习的时间明显下降,希望自己能更加努力一点吧,之后想通过发博客来监督自己在暑假家中的努力,希望自己能做…

剖析算法内部结构----------贪心算法

什么是贪心算法? 贪心算法(Greedy Algorithm)是一种在问题求解过程中,每一步都采取当前状态下最优(即最有利)的选择,从而希望导致最终的全局最优解的算法策略。 贪心算法的核心思想是做选择时&…

Elasticsearch 查询规则现已正式发布 - query rules

作者:来自 Elastic Kathleen DeRusso 查询规则(query rules)允许使用细粒度、上下文特定的解决方案来更改特定查询或搜索用例的搜索结果。这对于需要将品牌或赞助结果固定在特定关键字的搜索结果列表顶部的广告系列很有帮助,但对于…

B2 双电机系列挂轨巡检机器人:解决巡检难题,提升工业效能

随着工业自动化的不断发展,传统的人工巡检方式已经难以满足现代工业对安全、效率和精度的要求。旗晟机器人推出的B2双电机系列挂轨巡检机器人,以其独特的优势,为工业巡检领域带来了革命性的变化。 一、产品亮点 B2双电机系列挂轨巡检机器人以…

数据结构初阶最终讲:排序

数据结构初阶最终讲:排序 1.排序的概念及其运用1.1什么是排序1.2排序的运用1.3常见排序算法 2.冒泡排序3.直接插入排序4.堆排序5.测试代码:排序性能对比5.1直接插入排序时间复杂度分析 6.希尔排序6.1希尔排序时间复杂度分析 7.选择排序7.1初步思路7.2选择…

【Python系列】异步编程在 Python 中的应用

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

WinCC7.5零基础教学:多功能VB/C脚本基础框架模板程序详解!报表、配方、面板类型、菜单栏切换画、IO控制模板一应俱全,0基础小白值得拥有!

了解基础框架完整功能请观看视频! 观看完整教学视频点击这里(腾讯视频可放心观看) 以下是wincc多功能脚本基础框架项目功能简介: 功能一:多功能标题窗口模块 模块主要功能包括实时报警窗口信息、人员登录登出、报警消…

24暑假算法刷题 | Day30 | 贪心算法 IV | 452. 用最少数量的箭引爆气球,435. 无重叠区间,763. 划分字母区间

目录 452. 用最少数量的箭引爆气球题目描述题解 435. 无重叠区间题目描述题解 763. 划分字母区间题目描述题解 452. 用最少数量的箭引爆气球 点此跳转题目链接 题目描述 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中…

印刷企业实施数字工厂管理系统后能提升哪些效益

在当今这个数字化转型浪潮席卷全球的时代,印刷企业作为传统制造业的重要组成部分,正面临着前所未有的挑战与机遇。为了提升生产效率、降低成本、增强市场竞争力,越来越多的印刷企业开始引入数字工厂管理系统,这一举措不仅重塑了企…

Inno Setup根据系统的不同(32位/64位)安装不同的exe

注意事项 Inno Setup6.0及以上版本生成的可执行文件,可以运行在Windows7及以上系统,不支持WindowsXP系统。 如果要运行在WindowsXP系统上,需要下载Inno Setup6.0之前的版本。 Inno Setup 汉化版5.3.4下载链接: https://download…

从入门到精通:大学生编程技能提升全攻略

文章目录 每日一句正能量前言编程语言选择编程语言选择:为新手导航Python:初学者的友好伙伴JavaScript:Web开发的核心Java:企业级应用的经典C:系统编程的基石Ruby:优雅高效的编程Swift:iOS开发的…

OBS设置大揭秘:参数优化技巧与顶级录屏软件全攻略

在这个数字化的时代,屏幕录制已成为我们记录和分享知识、技能的重要手段。如果你还在为寻找一款既专业又易用的录屏软件而烦恼,那么今天的文章将为你揭开谜底。 录屏软件一、OBS studio OBS studio,作为录屏和直播领域的标杆,其功…