力扣题解 1928

news/2024/12/31 1:38:08/

题目描述(困难)

规定时间内到达终点的最小费用

一个国家有 n 个城市,城市编号为 0 到 n - 1 ,题目保证 所有城市 都由双向道路 连接在一起 。道路由二维整数数组 edges 表示,其中 edges[i] = [xi, yi, timei] 表示城市 xi 和 yi 之间有一条双向道路,耗费时间为 timei 分钟。两个城市之间可能会有多条耗费时间不同的道路,但是不会有道路两头连接着同一座城市。

每次经过一个城市时,你需要付通行费。通行费用一个长度为 n 且下标从 0 开始的整数数组 passingFees 表示,其中 passingFees[j] 是你经过城市 j 需要支付的费用。

一开始,你在城市 0 ,你想要在 maxTime 分钟以内 (包含 maxTime 分钟)到达城市 n - 1 。旅行的 费用 为你经过的所有城市 通行费之和 (包括 起点和终点城市的通行费)。

给你 maxTime,edges 和 passingFees ,请你返回完成旅行的 最小费用 ,如果无法在 maxTime 分钟以内完成旅行,请你返回 -1 。

在这里插入图片描述


要解决这个问题,我们可以使用动态规划结合图的最短路径算法来实现。我们需要在给定的时间限制内,从起点城市(城市0)到达终点城市(城市n-1),并且在此过程中使得经过的所有城市的通行费之和最小。

解题思路

  1. 图的表示:用邻接表来表示城市之间的道路。对于每个城市,存储它可以到达的其他城市及对应的时间。

  2. 动态规划状态定义:定义一个二维数组 dp[i][t],表示在时间 t 时到达城市 i 的最小费用。

  3. 初始状态dp[0][0] = passingFees[0],表示从城市0出发,时间为0时,费用为经过城市0的费用。

  4. 状态转移

    • 遍历每一条边 (xi, yi, timei),如果从城市 xi 到城市 yi 的时间 timei 加上当前时间 t 不超过 maxTime,则更新 dp[yi][t + timei]min(dp[yi][t + timei], dp[xi][t] + passingFees[yi])
    • 同时也从 yixi 做同样的更新(因为是双向道路)。
  5. 结果计算:遍历所有可能的时间 t,找到 dp[n-1][t] 的最小值,即为从城市0到城市n-1的最小费用。

  6. 无法到达的情况:如果在所有时间内,dp[n-1][t] 都没有被更新,则返回 -1。

解题分析

  • 时间复杂度:由于需要遍历所有的边,并且对于每个城市需要遍历所有可能的时间,时间复杂度为 (O(E \times T)),其中 (E) 是边的数量,(T) 是 maxTime
  • 空间复杂度:需要存储一个二维数组 dp,空间复杂度为 (O(n \times T))。

C++代码示例

int minCost(int maxTime, vector<vector<int>>& edges, vector<int>& passingFees) {int n = passingFees.size();vector<vector<pair<int, int>>> graph(n);// Build the graphfor (const auto& edge : edges) {int u = edge[0], v = edge[1], time = edge[2];graph[u].emplace_back(v, time);graph[v].emplace_back(u, time);}// DP arrayvector<vector<int>> dp(n, vector<int>(maxTime + 1, INT_MAX));dp[0][0] = passingFees[0];// Min-Heap to store (cost, time, city)priority_queue<tuple<int, int, int>, vector<tuple<int, int, int>>, greater<>> pq;pq.emplace(passingFees[0], 0, 0);while (!pq.empty()) {auto [cost, time, city] = pq.top();pq.pop();if (city == n - 1) {return cost;}for (const auto& [nextCity, travelTime] : graph[city]) {int newTime = time + travelTime;if (newTime <= maxTime) {int newCost = cost + passingFees[nextCity];if (newCost < dp[nextCity][newTime]) {dp[nextCity][newTime] = newCost;pq.emplace(newCost, newTime, nextCity);}}}}return -1;
}

代码解析

  • 图的构建:使用邻接表来存储每个城市可以到达的其他城市及其耗费的时间。
  • 优先队列:使用优先队列来实现Dijkstra算法的变体,优先队列中存储的是 (当前费用, 当前时间, 当前城市)
  • 状态更新:对于每个城市,检查所有可以到达的相邻城市,更新到达这些城市的费用和时间。
  • 结果输出:如果在遍历过程中到达了城市 n-1,则输出当前的费用;如果遍历完所有可能的路径都无法到达城市 n-1,则输出 -1。

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

相关文章

Redis: 集群测试和集群原理

集群测试 1 ) SET/GET 命令 测试 set 和 get 因为其他命令也基本相似&#xff0c;我们在 101 节点上尝试连接 103 $ /usr/local/redis/bin/redis-cli -c -a 123456 -h 192.168.10.103 -p 6376我们在插入或读取一个 key的时候&#xff0c;会对这个key做一个hash运算&#xff0c…

C语言-指针

0.引入 int a; //定义了一个整型变量 名为a a 100; // a作为左值, 把100存放到a所对应的存储单元中 int b a; // a作为右值, 取a所对应的存储单元(变量本身)的值, 然后再把这个值存放到变量b对应的空间中 在C语言中, 任何一个变量名 都有两层含义: …

Mac通过ssh连接工具远程登录服务器( Royal TSX安装及使用)

一、Royal TSX软件下载地址 Royal Apps 二、Royal TSX 汉化 汉化包地址&#xff1a;GitCode - 全球开发者的开源社区,开源代码托管平台 三、基础配置 Royal TSX 是一款基于插件的应用&#xff0c;刚安装时还不具备使用条件&#xff0c;需要进行一些基础配置 1 安装基础插件…

JVM 基础、GC 算法与 JProfiler 监控工具详解

目录 1、引言 1.1 JVM内存与本地内存 1.2 JVM与JDK的关系 2、JVM基础 2.1 JVM&#xff08;Java Virtual Machine&#xff09; 2.2 Java与JVM的关系 2.3 JVM的内存结构 2.3.1 堆内存 2.3.2 栈内存 2.3.3 方法区 2.3.4 本地方法栈 2.3.5 程序计数器&#xff08;PC寄存…

【深度学习】交叉熵

交叉熵&#xff08;Cross-Entropy&#xff09;是信息论中的一个重要概念&#xff0c;也是在机器学习和深度学习中用于分类任务的常见损失函数。它衡量的是两个概率分布之间的差异&#xff0c;特别是模型的预测概率分布与真实分布的差异。 交叉熵最初是从信息论引入的&#xff0…

Nginx性能优化全攻略:打造高性能Web服务器

Nginx作为一款高性能的Web服务器和反向代理服务器,以其轻量级、高并发处理能力而闻名。然而,要充分发挥Nginx的潜力,需要进行全面而细致的优化。本文将深入探讨Nginx的性能优化策略,从基础配置到高级技巧,全方位提升您的Nginx服务器性能。 © ivwdcwso (ID: u012172506) 基…

Spring Cloud全解析:服务调用之OpenFeign集成OkHttp

文章目录 OpenFeign集成OkHttp添加依赖配置连接池yml配置 OpenFeign集成OkHttp OpenFeign本质是HTTP来进行服务调用的&#xff0c;也就是需要集成一个Http客户端。 使用的是Client接口来进行请求的 public interface Client {// request是封装的请求方式、参数、返回值类型/…

Linux编译部署PHP环境

1.准备工作 安装前我们需要设置防护墙&#xff0c;开放端口&#xff0c;更新yum源 # 1.防火墙 systemctl status firewalld 看到active(running)就意味着防火墙打开了 systemctl stop firewalld 看到inactive(dead)就意味着防火墙关闭了 systemctl start fire…