787. Cheapest Flights Within K Stops

Difficulty:
Related Topics:
Similar Questions:

Problem

There are n cities connected by some number of flights. You are given an array flights where flights[i] = [fromi, toi, pricei] indicates that there is a flight from city fromi to city toi with cost pricei.

You are also given three integers src, dst, and k, return **the cheapest price from src to dst with at most k stops. If there is no such route, return **-1.

  Example 1:

Input: n = 4, flights = [[0,1,100],[1,2,100],[2,0,100],[1,3,600],[2,3,200]], src = 0, dst = 3, k = 1
Output: 700
Explanation:
The graph is shown above.
The optimal path with at most 1 stop from city 0 to 3 is marked in red and has cost 100 + 600 = 700.
Note that the path through cities [0,1,2,3] is cheaper but is invalid because it uses 2 stops.

Example 2:

Input: n = 3, flights = [[0,1,100],[1,2,100],[0,2,500]], src = 0, dst = 2, k = 1
Output: 200
Explanation:
The graph is shown above.
The optimal path with at most 1 stop from city 0 to 2 is marked in red and has cost 100 + 100 = 200.

Example 3:

Input: n = 3, flights = [[0,1,100],[1,2,100],[0,2,500]], src = 0, dst = 2, k = 0
Output: 500
Explanation:
The graph is shown above.
The optimal path with no stops from city 0 to 2 is marked in red and has cost 500.

  Constraints:

Solution

/**
 * @param {number} n
 * @param {number[][]} flights
 * @param {number} src
 * @param {number} dst
 * @param {number} k
 * @return {number}
 */
var findCheapestPrice = function(n, flights, src, dst, k) {
    var map = Array(n).fill(0).map(() => []);
    for (var i = 0; i < flights.length; i++) {
        map[flights[i][0]].push([flights[i][1], flights[i][2]]);
    }
    var dp = Array(n).fill(0).map(() => ({}));
    var res = dfs(src, dst, k, map, dp);
    return res;
};

var dfs = function(src, dst, k, map, dp) {
    if (dp[src][k] !== undefined) return dp[src][k];
    if (src === dst) return 0;
    if (k === -1) return -1;
    var res = -1;
    for (var i = 0; i < map[src].length; i++) {
        var tmp = dfs(map[src][i][0], dst, k - 1, map, dp);
        if (tmp === -1) continue;
        if (res === -1 || res > tmp + map[src][i][1]) {
            res = tmp + map[src][i][1];
        }
    }
    dp[src][k] = res;
    return res;
};

Explain:

DFS + DP.

Complexity: