# K 站中转内最便宜的航班

leetcode - 787. K 站中转内最便宜的航班 (opens new window)

有 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

# 代码

# Johninch

递归,超时(动态规划不要用递归来做)

// F(src, dst, k) = Min(F(src, dst-1, k-1) + F(dst-1, dst, 1))
let findCheapestPrice = function(n, flights, src, dst, k) {
    let cheap = (flights, src, dst, k) => {
        let prev = flights.filter(item => item[1] === dst)
        let min = Math.min.apply(null, prev.map(item => {
            if (k > -1 && item[0] === src) {
                // 边界1:从dst往回找到了src,且中转次数不为-1,返回当前价格
                return item[2]
            } else if (k == 0 && item[0] !== src) {
                // 边界2:中转次数已经为0,但从dst往回找没有找到src,设一个无限大的价格
                return Number.MAX_SAFE_INTEGER
            } else {
                // 状态转移方程
                return item[2] + cheap(flights, src, item[0], k-1)
            }
        }))

        return min
    }

    // 增加返回值是不是Number.MAX_SAFE_INTEGER,如果是返回-1
    let min = cheap(flights, src, dst, k)
    return min >= Number.MAX_SAFE_INTEGER ? -1 : min
};
Last Updated: 4/24/2020, 1:44:36 PM