ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LC-787. K 站中转内最便宜的航班

2021-08-25 08:35:31  阅读:203  来源: 互联网

标签:src 787 LC int 中转 dst 航班 flights


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

有 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
解释:
城市航班图如下
image

从城市 0 到城市 2 在 1 站中转以内的最便宜价格是 200,如图中红色所示。
解析:

这是一道最短路径问题,可是有一个步数k的限定,dijkstra无法限定步数,spfa也不可以,那就要考虑spfa的原生算法,Bellman Ford

Bellman Ford/SPFA 都是基于动态规划,其原始的状态定义为 f[i][k],f[i][k] 代表从起点到 i 点,且经过最多 k 条边的最短路径。这样的状态定义引导我们能够使用 Bellman Ford 来解决有边数限制的最短路问题。
同样多源汇最短路算法 Floyd 也是基于动态规划,其原始的三维状态定义为 f[i][j][k],f[i][j][k] 代表从点 i 到点 j,且经过的所有点编号不会超过 k(即可使用点编号范围为 [1, k])的最短路径。这样的状态定义引导我们能够使用 Floyd 求最小环或者求“重心点”(即删除该点后,最短路值会变大

class Solution {
public:
    int findCheapestPrice(int n, vector<vector<int>>& flights, int src, int dst, int k) {
        //dp[i][j] 表示走了i步,到达j点花费最小
        vector<vector<int>> dp(k + 2, vector<int>(n + 1, INT_MAX / 2));
        dp[0][src] = 0;
        for(int i = 1; i <= k + 1; i++) {
            for(auto &k : flights) {
                int x = k[0], y = k[1], z = k[2];
                dp[i][y] = min(dp[i - 1][x] + z, dp[i][y]);
            }
        }
        int ans = INT_MAX / 2;
        for(int i = 0; i <= k + 1; i++) {
            ans = min(ans, dp[i][dst]);
        }
        return ans == INT_MAX / 2 ? -1 :ans;
    }
};

标签:src,787,LC,int,中转,dst,航班,flights
来源: https://www.cnblogs.com/smilerain/p/15183330.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有