有 n 个城市通过 m 个航班连接。每个航班都从城市 u 开始,以价格 w 抵达 v。

现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到从 src 到 dst 最多经过 k 站中转的最便宜的价格。 如果没有这样的路线,则输出 -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,如图中蓝色所示。

提示:

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

思路分析:\color{blue}{思路分析:}思路分析:典型的最短路径搜索问题,蛋式这道题多加了一个K的限制,否则直接使用迪杰斯特拉算法。
方法一:深度优先搜索法(回溯法)。

class Solution {public:int minRes = INT_MAX;int findCheapestPrice(int n, vector<vector<int>>& flights, int src, int dst, int K) {//首先利用flights构建图的信息vector<vector<int>> graph(n, vector<int>(n, -1));for (auto &flight : flights){graph[flight[0]][flight[1]] = flight[2];}vector<bool> visited(n, false);//标记当前线路中已经走过的点visited[src] = true;dfs(graph, visited, n, dst, K, 0, src, 0);//从src开始搜索return minRes == INT_MAX ? -1 : minRes;}//haveCost表示已经花费了的费用,nowSrc现在所处的点,myK到达nowSrc已经经过的中转站个数void dfs(vector<vector<int>> &graph, vector<bool> &visited, int n, int dst, int K, int haveCost, int nowSrc, int myK){if (nowSrc == dst){//到达目的地minRes = min(minRes, haveCost);return;}//剪枝:中转站个数不能超过K,花费不能超过已经找的最小花费if (myK > K || haveCost >= minRes){return;}//搜索下一个点for (int i = 0; i < n; ++i){if (!visited[i] && graph[nowSrc][i] != -1){visited[i] = true;dfs(graph, visited, n, dst, K, haveCost + graph[nowSrc][i], i, myK + 1);visited[i] = false;}}}
};


方法二:动态规划法。

class Solution {public:int findCheapestPrice(int n, vector<vector<int>>& flights, int src, int dst, int K) {//dp[i][k]表示从src至多经过k站到达i的最少费用vector<vector<int>> dp(n, vector<int>(K + 2, INT_MAX));//初始化 src 到 src的费用为0for (int k = 0; k <= K + 1; ++k){dp[src][k] = 0;}//开始动态规划for (int k = 1; k <= K + 1; ++k){for (auto &flight : flights){//如果从src至多经过k - 1站可达flight[0]if (dp[flight[0]][k - 1] != INT_MAX){//更新从src至多经过k站到达flight[1]dp[flight[1]][k] = min(dp[flight[1]][k], dp[flight[0]][k - 1] + flight[2]);}}}return dp[dst][K+1] == INT_MAX ? -1 : dp[dst][K+1];}
};

LeetCode K站中转内最便宜的航班(回溯法、动态规划)相关推荐

  1. leetcode - K 站中转内最便宜的航班

    有 nnn 个城市通过 mmm 个航班连接.每个航班都从城市 uuu 开始,以价格 www 抵达 vvv. 现在给定所有的城市和航班,以及出发城市 srcsrcsrc 和目的地 dstdstdst,你 ...

  2. LeetCode 787. K 站中转内最便宜的航班(图/Bellman Ford算法)

    文章目录 贝尔曼-福特算法(Bellman-Ford) 简介 算法思想 算法执行过程 应用 题目描述 分析 代码 LeetCode 787. K 站中转内最便宜的航班 题目描述 Bellman For ...

  3. LeetCode——787. K 站中转内最便宜的航班(Cheapest Flights Within K Stops)[中等]——分析及代码(Java)

    LeetCode--787. K 站中转内最便宜的航班[Cheapest Flights Within K Stops][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 动态规划 ( ...

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

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

  5. leetcode每日一题系列——787. K 站中转内最便宜的航班

    787. K 站中转内最便宜的航班 难度中等346收藏分享切换为英文接收动态反馈 有 n 个城市通过一些航班连接.给你一个数组 flights ,其中 flights[i] = [fromi, toi ...

  6. 787. K 站中转内最便宜的航班(动态规划)

    package com.wsq.leetcode; /*** 787. K 站中转内最便宜的航班* @author wsq* @date 2020/10/21有 n 个城市通过 m 个航班连接.每个航 ...

  7. 动态规划——K 站中转内最便宜的航班

    问题来源:leetcode 787. K 站中转内最便宜的航班 有 n 个城市通过 m 个航班连接.每个航班都从城市 u 开始,以价格 w 抵达 v. 现在给定所有的城市和航班,以及出发城市 src ...

  8. 365天挑战LeetCode1000题——Day 103 400题 检查二进制字符串字段 最大子序列交替和 最低票价 K 站中转内最便宜的航班

    400题,用时103天,平均3.88题/天,预计154天,也就是5个月后完成目标 1784. 检查二进制字符串字段 代码实现(模拟) class Solution {public:bool check ...

  9. 787. K 站中转内最便宜的航班(加权有向图的最短路径)

    题目:787. K 站中转内最便宜的航班 两种方法: 方法一: 思路: 加权图的最短路径 1. 首先将航线转化为字典形式存储.(当前城市–下一城市–费用) 2. 建一个双向队列,元素为元组形式.(当前 ...

  10. 0图论/动态规划中等 LeetCode787. K 站中转内最便宜的航班

    787. K 站中转内最便宜的航班 描述 有 n 个城市通过一些航班连接.给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 ...

最新文章

  1. 快手团队长文解读:基于FPGA加速的自动语音识别在大规模直播和短视频场景的应用...
  2. Could not find the main class: org.apache.catalina.startup.Boostrap. Program will exit.
  3. 12.2 全局CSS样式
  4. TIMING_06 VIVADO环境下的时序约束 之 输入延迟约束
  5. 论文浅尝 | 利用 KG Embedding 进行问题回答
  6. 网页java在div输出内容_JS实现读取xml内容并输出到div中的方法示例
  7. 开关电源怎么测试文波_开关电源纹波标准与规范测试说明
  8. 动态分区分配算法代码_【代码】巩敦卫等TEVC论文:基于区间相似度分析的协同动态区间多目标进化优化算法...
  9. 【java学习之路】(javaWeb篇)006.构造函数、JQuery函数库
  10. mac上如何将文件批量重命名的方法
  11. win10远程桌面Android软件,Microsoft发布了适用于Android的远程桌面应用程序10.0.7版的重大更新...
  12. 企业微信可以批量删除聊天记录吗?
  13. mysql +cobar_转:阿里开源Mysql分布式中间件:Cobar
  14. 基于Pygame的中国象棋的制作(China Chess)
  15. RN:App版本更新提示方案
  16. vue数据管理系统项目说明文档
  17. 71 ----二次曲面方程:椭球面、双曲面、抛物面、二次曲面的种类
  18. layui框架学习(1:布局)
  19. 对于position定位的认识
  20. 合理利用自制力,养成好的习惯

热门文章

  1. WeChatTweak-微信小助手 v1.2.2 详细安装教程
  2. 几个例子理解博弈论与纳什均衡
  3. C++ Grammar
  4. 0day漏洞是什么意思啊?
  5. 手写jQuery轮播图插件,即拿即用,更多接口,更少代码实现你想要的轮播图~~
  6. Jquery 禁止键盘Backspace键
  7. 什么是“理解”?如何在人工智能中定义“理解”?(what is understanding ?)
  8. 考研常考知识点(复试)
  9. cs1.6服务器修改游戏类型,如何自己架设CS1.6服务器?
  10. Java面试之Java基础篇(offer 拿来吧你)