当前位置:网站首页>LeetCode刷题系列 -- 787. K 站中转内最便宜的航班
LeetCode刷题系列 -- 787. K 站中转内最便宜的航班
2022-08-02 05:01:00 【在河之洲木水】
有 n 个城市通过一些航班连接。给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,以价格 pricei 抵达 toi。
现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到出一条最多经过 k 站中转的路线,使得从 src 到 dst 的 价格最便宜 ,并返回该价格。 如果不存在这样的路线,则输出 -1。
示例 1:
输入:
n = 3, edges = [[0,1,100],[1,2,100],[0,2,500]]
src = 0, dst = 2, k = 1
输出: 200
解释:
城市航班图如下
从城市 0 到城市 2 在 1 站中转以内的最便宜价格是 200,如图中红色所示。
示例 2:
输入:
n = 3, edges = [[0,1,100],[1,2,100],[0,2,500]]
src = 0, dst = 2, k = 0
输出: 500
解释:
城市航班图如下
从城市 0 到城市 2 在 0 站中转以内的最便宜价格是 500,如图中蓝色所示。
提示:
1 <= n <= 100
0 <= flights.length <= (n * (n - 1) / 2)
flights[i].length == 3
0 <= fromi, toi < n
fromi != toi
1 <= pricei <= 104
航班没有重复,且不存在自环
0 <= src, dst, k < n
src != dst
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/cheapest-flights-within-k-stops
思路:参考大神写的:旅游省钱大法:加权最短路径 :: labuladong的算法小抄
想求到 dst 城市花费最少,那就求与其临近的城市
java代码:
class Solution {
public int findCheapestPrice(int n, int[][] flights, int src, int dst, int k) {
// 定义 map, key 为 图某个节点,value 为 (入度节点,权重值)
// to -> (from, price)
Map<Integer, List<int[]>> map = new HashMap<>();
for (int[] dists : flights) {
int from = dists[0];
int to = dists[1];
int price = dists[2];
int[] subValue = {from, price};
if (!map.containsKey(to)) {
List<int[]> inValues = new LinkedList<>();
inValues.add(subValue);
map.put(to, inValues);
} else {
map.get(to).add(subValue);
}
}
// 记录表,记录从 src 到 memp[i][j] 的最少花费且中转数为 j
int[][] memp = new int[n][k + 1];
for (int[] value : memp) {
Arrays.fill(value, -888);
}
return dp(src, dst, k+1, map, memp);
}
int dp(int src, int dst, int k, Map<Integer, List<int[]>> map, int[][] memp) {
if (dst == src) {
return 0;
}
if (k == 0) {
return -1;
}
int res = Integer.MAX_VALUE;
// 当dst 有入度节点时
if (map.containsKey(dst)) {
for (int[] subValues : map.get(dst)) {
int from = subValues[0];
int price = subValues[1];
int fromValue = memp[from][k - 1];
if (fromValue == -888) {
fromValue = dp(src, from, k - 1, map, memp);
memp[from][k - 1] = fromValue;
}
if (fromValue != -1) {
res = Math.min(res, price + fromValue);
}
}
}
return res == Integer.MAX_VALUE ? -1 : res;
}
}
边栏推荐
猜你喜欢
随机推荐
pg数据库报错问题,有懂的吗
07-传统的生产者消费者问题、防止虚假唤醒
力扣练习——37 复原IP地址
选择黑盒测试用例设计方法的综合策略方案总结
MySQL multi-table association one-to-many query to get the latest data
Js数据类型转化之数组的join方法
CubeSat Light-1
mysql 8.0.28版本安装配置方法图文教程
Liquidated damages are too high"
PDF file conversion format
MP更新操作方式
MySql字符串拆分实现split功能(字段分割转列、转行)
使用pycharm debug 深度学习代码
UE4 事件图表不小心拉了很远,找不到一开始创建的节点
IOT物联网概述及应用层架构入门篇
c语言:查漏补缺(三)
MYSQL 唯一约束
MySQL 5.7详细下载安装配置教程
Detailed explanation of mysql stored procedure
来自雪域高原的馈赠——大凉山高原生态糖心苹果