问题描述

  1. n 个城市通过 m 个航班连接。每个航班都从城市 u 开始,以价格 w 抵达 v
  2. 现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到从 src dst 最多经过站中转的最便宜的价格。 如果没有这样的路线,则输出 -1
  3.  
  4. 示例 1
  5. 输入:
  6. n = 3, edges = [[0,1,100],[1,2,100],[0,2,500]]
  7. src = 0, dst = 2, k = 1
  8. 输出: 200
  9. 解释:
  10. 城市航班图如下

  1. 从城市 0 到城市 2 1 站中转以内的最便宜价格是 200,如图中红色所示。
  2. 示例 2
  3. 输入:
  4. n = 3, edges = [[0,1,100],[1,2,100],[0,2,500]]
  5. src = 0, dst = 2, k = 0
  6. 输出: 500
  7. 解释:
  8. 城市航班图如下

  1. 从城市 0 到城市 2 0 站中转以内的最便宜价格是 500,如图中蓝色所示。
  2.  

提示:

  • n 范围是 [1, 100],城市标签从 0 到 n - 1.
  • 航班数量范围是 [0, n * (n - 1) / 2].
  • 每个航班的格式 (src, dst, price).
  • 每个航班的价格范围是 [1, 10000].
  • k 范围是 [0, n - 1].
  • 航班没有重复,且不存在环路

代码

  1. class Solution {
  2. public:
  3. int findCheapestPrice(int n, vector<vector<int>>& flights, int src, int dst, int K) {
  4. int ans = INT_MAX;
  5. vector<bool> isVisited(n+1,false);
  6. unordered_map<int,vector<vector<int>>> graph;
  7. for(auto flight:flights)
  8. graph[flight[0]].push_back({flight[1],flight[2]});
  9. helper(graph,isVisited,K,src,dst,ans,0);
  10. return ans == INT_MAX?-1:ans;
  11. }
  12. void helper(unordered_map<int,vector<vector<int>>> &graph,vector<bool>&isVisited,int K,int cur,int& dst,int &ans,int sum)
  13. {
  14. if(cur == dst)
  15. {
  16. ans = sum;return;
  17. }
  18. if(K < 0)return;
  19. for(auto node:graph[cur])
  20. {
  21. if(isVisited[node[0]] || sum+node[1] > ans)continue;
  22. isVisited[node[0]] = true;
  23. helper(graph,isVisited,K-1,node[0],dst,ans,sum+node[1]);
  24. isVisited[node[0]] = false;
  25. }
  26. }
  27. };

结果

  1. 执行用时:1976 ms, 在所有 C++ 提交中击败了5.05%的用户
  2. 内存消耗:158.1 MB, 在所有 C++ 提交中击败了5.06%的用户

代码

  1. public:
  2. int findCheapestPrice(int n, vector<vector<int>>& flights, int src, int dst, int K) {
  3. int ans = INT_MAX;
  4. vector<vector<int>> dp(K+2,vector<int>(n+1,1e9));
  5. dp[0][src] = 0;
  6. for(int i = 1; i < K+2; ++i)
  7. {
  8. dp[i][src] = 0;
  9. for(auto flight:flights)
  10. {
  11. dp[i][flight[1]] = min(dp[i][flight[1]],dp[i-1][flight[0]]+flight[2]);
  12. }
  13. }
  14. return dp[K+1][dst] == 1e9?-1:dp[K+1][dst];
  15. }
  16. };

结果

  1. 执行用时:208 ms, 在所有 C++ 提交中击败了14.26%的用户
  2. 内存消耗:26.1 MB, 在所有 C++ 提交中击败了5.82%的用户

leetcode 787. K 站中转内最便宜的航班的更多相关文章

  1. Java实现 LeetCode 787 K 站中转内最便宜的航班(两种DP)

    787. K 站中转内最便宜的航班 有 n 个城市通过 m 个航班连接.每个航班都从城市 u 开始,以价格 w 抵达 v. 现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是 ...

  2. LeetCode——787. K 站中转内最便宜的航班

    有 n 个城市通过 m 个航班连接.每个航班都从城市 u 开始,以价格 w 抵达 v. 现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到从 src 到 dst 最多经过 ...

  3. 【力扣leetcode】-787. K站中转内最便宜的航班

    题目描述: 有 n 个城市通过一些航班连接.给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,以价格 p ...

  4. [Swift]LeetCode787. K 站中转内最便宜的航班 | Cheapest Flights Within K Stops

    There are n cities connected by m flights. Each fight starts from city u and arrives at v with a pri ...

  5. leetcode_787【K 站中转内最便宜的航班】

    有 n 个城市通过 m 个航班连接.每个航班都从城市 u 开始,以价格 w 抵达 v. 现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到从 src 到 dst 最多经过 ...

  6. [LeetCode] Cheapest Flights Within K Stops K次转机内的最便宜的航班

    There are n cities connected by m flights. Each fight starts from city u and arrives at v with a pri ...

  7. [链表]LeetCode 25 K组一个翻转链表

    LeetCode 25 k组一个翻转链表 TITLE 示例 1: 输入:head = [1,2,3,4,5], k = 2 输出:[2,1,4,3,5] 示例 2: 输入:head = [1,2,3, ...

  8. [LeetCode] 787. Cheapest Flights Within K Stops K次转机内的最便宜航班

    There are n cities connected by m flights. Each fight starts from city u and arrives at v with a pri ...

  9. [LeetCode] 787. Cheapest Flights Within K Stops_Medium tag: Dynamic Programming, BFS, Heap

    There are n cities connected by m flights. Each fight starts from city u and arrives at v with a pri ...

随机推荐

  1. 痞子衡嵌入式:把玩i.MXRT1062 TencentOS Tiny EVB_AIoT开发板(1) - 开发环境搭建与点灯

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1062 TencentOS Tiny EVB_AIoT开发板环境搭建与点灯. 腾讯 TencentOS 团队于2021年1 ...

  2. c++内存分布之纯虚函数

    关于 本文演示环境:VS2017+32位程序. 纯虚函数是一种特殊的虚函数.可以预测到:虚函数的结论同样适用纯虚函数,但是纯虚函数是一种特殊的存在,还是看看实际结果. 代码写的不够规范: 因为任何带虚 ...

  3. 【LeetCode】904. Fruit Into Baskets 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/fruit-in ...

  4. [LeetCode] 448. Find All Numbers Disappeared in an Array 找到数组中消失的数字

    题目描述 给定n个数字的数组,里面的值都是1-n,但是有的出现了两遍,因此有的没有出现,求没有出现值这个数组中的值有哪些. 要求不能用额外的空间(除了返回列表之外),时间复杂度n 思路 因为不能用额外 ...

  5. 分布式系统(二)——GFS

    分布式存储系统的难点 在存储系统中,为了获得巨大的性能加成,一个很自然的想法就是采用分片(sharding),将数据分割存储到多台服务器上,这样获得了更大的存储容量,而且可以并行地从多台服务器读取数据 ...

  6. Codeforces 450C:Jzzhu and Chocolate(贪心)

    C. Jzzhu and Chocolate time limit per test: 1 seconds memory limit per test: 256 megabytes input: st ...

  7. 论文翻译:2020_Acoustic Echo Cancellation by Combining Adaptive Digital Filter and Recurrent Neural Network

    论文地址:https://arxiv.53yu.com/abs/2005.09237 自适应数字滤波与循环神经网络相结合的回声消除技术 摘要 回声消除(AEC)在语音交互中起关键作用.由于明确的数学原 ...

  8. 编写Java程序,现要求使用 dom4j 解析 city.xml 文档,实现省份及对应城市的联动特效,效果如图所示

    查看本章节 查看作业目录 需求说明: 现要求使用 dom4j 解析 city.xml 文档,实现省份及对应城市的联动特效,效果如图所示 实现思路: 创建解析 XML 文档类 ParseXML 和窗体类 ...

  9. 【MySQL作业】分组查询 group by 子句——美和易思分组查询应用习题

    点击打开所使用到的数据库>>> 1.按照商品类型分组统计商品数量和平均单价,并按平均单价升序显示. -- 按照商品类型分组统计商品数量和平均单价,并按平均单价升序显示: select ...

  10. WPF中修改ListBox项的样式病修改选中项的背景颜色

    最终效果: 1 <ListBox Name="cmb"> 2 <!--修改颜色--> 3 <ListBox.Resources> 4 <! ...