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

Leetcode 2093. 前往目标城市的最小费用

1.题目基本信息

1.1.题目描述

一组公路连接 n 个城市,城市编号为从 0 到 n - 1 。 输入包含一个二维数组 highways ,其中 highways[i] = [city1i, city2i, tolli] 表示有一条连接城市 city1i 和 city2i 的双向公路,允许汽车缴纳值为 tolli 的费用从 city1i 前往 city2i 或 从 city2i 前往 city1i 。

另给你一个整数 discounts 表示你最多可以使用折扣的次数。你可以使用一次折扣使通过第 ith 条公路的费用降低至 tolli / 2(向下取整)。 最多只可使用 discounts 次折扣, 且 每条公路最多只可使用一次折扣 。

返回从城市0 前往城市 n - 1 的 最小费用 。如果不存在从城市0 前往城市 n - 1 的路径,返回 -1 。

1.2.题目地址

https://leetcode.cn/problems/minimum-cost-to-reach-city-with-discounts/description/

2.解题方法

2.1.解题思路

Dijkstra算法

2.2.解题步骤

第一步,使用常规的方法构建dijkstra,采用堆模式

  • 1.1.构建邻接表形式的图

第二步,使用堆进行遍历。堆中结点的形式为(结点到start的结点的距离,当前结点,剩余的折扣数)

  • 2.1.从堆中弹出最近的结点

  • 2.2.过滤掉堆中在costs中已经存在更近的距离的结点(第一个从堆中弹出(node,remainDiscounts)的一定是最近的)

  • 2.3.在到达终点时,进行退出

  • 2.4.更新当前状态的最短距离

  • 2.5.遍历邻结点并将新的结点压入堆中(分为不使用折扣的结点和使用折扣的虚拟结点)

第三步,没法到达终点的情况

3.解题代码

python代码

from collections import defaultdict
from heapq import heappush, heappopclass Solution:def minimumCost(self, n: int, highways: List[List[int]], discounts: int) -> int:# 同类型Dijkstra题目:Leetcode LCP 35. 电动车游城市# 思路:Dijkstra算法变体# 第一步,使用常规的方法构建dijkstra,采用堆模式# 1.1.构建邻接表形式的图graph = defaultdict(list)for u, v, weight in highways:graph[u].append((v, weight))graph[v].append((u, weight))# 第二步,使用堆进行遍历。堆中结点的形式为(结点到start的结点的距离,当前结点,剩余的折扣数)heap = [(0, 0, discounts)]costs = {}while heap:# 2.1.从堆中弹出最近的结点dist, node, remainDiscounts = heappop(heap)# 2.2..过滤掉堆中在costs中已经存在更近的距离的结点(第一个从堆中弹出(node,remainDiscounts)的一定是最近的)if (node, remainDiscounts) in costs:continue# 2.3.在到达终点时,进行退出if node == n - 1:return dist# 2.4.更新当前状态的最短距离costs[(node, remainDiscounts)] = dist# 2.5.遍历邻结点并将新的结点压入堆中(分为不使用折扣的结点和使用折扣的虚拟结点)for neigh, weight_ in graph[node]:heappush(heap, (dist + weight_, neigh, remainDiscounts))if remainDiscounts > 0:heappush(heap, (dist + int(weight_ / 2), neigh, remainDiscounts - 1))# 第三步,没法到达终点的情况return -1

4.执行结果

http://www.xdnf.cn/news/10526.html

相关文章:

  • SAR ADC 异步逻辑设计
  • Linux系统配置屏幕旋转和触摸旋转
  • 从冷上电到main()函数,Bootloader都做了什么?
  • 数据类型检测有哪些方式?
  • robot_lab学习笔记【MDP综述】
  • QuickJS 如何计算黄金分割率 ?
  • barker-OFDM模糊函数原理及仿真
  • Linux防火墙:全面解析IPTables的表、链、规则!
  • Cypress + TypeScript + Vue3
  • 数据库管理与高可用-MySQL全量,增量备份与恢复
  • 劫持进程注入
  • C语言进阶--程序的编译(预处理动作)+链接
  • 数据结构:递归(Recursion)
  • 基于TMC5160堵转检测技术的夹紧力控制系统设计与实现
  • 输入ifconfig,发现ens33不见了,无法连接至虚拟机
  • Golang——3、流程控制语句
  • C++实现伽罗华域生成及四则运算(三)
  • Python----目标检测(《SSD: Single Shot MultiBox Detector》论文和SSD的原理与网络结构)
  • CppCon 2014 学习:C++ in Huge AAA Games
  • STM32F407寄存器操作(多通道单ADC+DMA)
  • 前端面试准备-5
  • Mask_RCNN 环境配置及训练
  • QT中子线程触发主线程弹窗并阻塞等待用户响应-传统信号槽实现
  • DRW - 加密市场预测
  • 考研系列—操作系统:第四章、文件管理(part.2)
  • 利用DeepSeek编写能在DuckDB中读PostgreSQL表的表函数
  • 多任务——进程
  • 基于机器学习的心脏病预测模型构建与可解释性分析
  • WIN11+VSCODE搭建的c/c++环境调试报错解决
  • vue+mitt的简便使用