class Solution {
public:
int findCheapestPrice(int n, vector<vector<int>>& flights, int src, int dst, int k) {
}
};
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 解释: 城市航班图如下 从城市 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,如图中蓝色所示。
提示:
1 <= n <= 100
0 <= flights.length <= (n * (n - 1) / 2)
flights[i].length == 3
0 <= fromi, toi < n
fromi != toi
1 <= pricei <= 104
0 <= src, dst, k < n
src != dst
相似题目
原站题解
javascript 解法, 执行用时: 72 ms, 内存消耗: 43.7 MB, 提交时间: 2023-10-25 23:21:21
/** * @param {number} n * @param {number[][]} flights * @param {number} src * @param {number} dst * @param {number} k * @return {number} */ var findCheapestPrice1 = function(n, flights, src, dst, k) { const INF = 10000 * 101 + 1; const f = new Array(k + 2).fill(0).map(() => new Array(n).fill(INF)); f[0][src] = 0; for (let t = 1; t <= k + 1; ++t) { for (const flight of flights) { const j = flight[0], i = flight[1], cost = flight[2]; f[t][i] = Math.min(f[t][i], f[t - 1][j] + cost); } } let ans = INF; for (let t = 1; t <= k + 1; ++t) { ans = Math.min(ans, f[t][dst]); } return ans == INF ? -1 : ans; }; var findCheapestPrice = function(n, flights, src, dst, k) { const INF = 10000 * 101 + 1; let f = new Array(n).fill(INF); f[src] = 0; let ans = INF; for (let t = 1; t <= k + 1; ++t) { const g = new Array(n).fill(INF); for (const flight of flights) { const j = flight[0], i = flight[1], cost = flight[2]; g[i] = Math.min(g[i], f[j] + cost); } f = g; ans = Math.min(ans, f[dst]); } return ans == INF ? -1 : ans; };
golang 解法, 执行用时: 12 ms, 内存消耗: 4.6 MB, 提交时间: 2023-10-25 23:20:54
func findCheapestPrice1(n int, flights [][]int, src int, dst int, k int) int { const inf = 10000*101 + 1 f := make([][]int, k+2) for i := range f { f[i] = make([]int, n) for j := range f[i] { f[i][j] = inf } } f[0][src] = 0 for t := 1; t <= k+1; t++ { for _, flight := range flights { j, i, cost := flight[0], flight[1], flight[2] f[t][i] = min(f[t][i], f[t-1][j]+cost) } } ans := inf for t := 1; t <= k+1; t++ { ans = min(ans, f[t][dst]) } if ans == inf { ans = -1 } return ans } func findCheapestPrice(n int, flights [][]int, src int, dst int, k int) int { const inf = 10000*101 + 1 f := make([]int, n) for i := range f { f[i] = inf } f[src] = 0 ans := inf for t := 1; t <= k+1; t++ { g := make([]int, n) for i := range g { g[i] = inf } for _, flight := range flights { j, i, cost := flight[0], flight[1], flight[2] g[i] = min(g[i], f[j]+cost) } f = g ans = min(ans, f[dst]) } if ans == inf { ans = -1 } return ans } func min(a, b int) int { if a < b { return a } return b }
python3 解法, 执行用时: 192 ms, 内存消耗: 17 MB, 提交时间: 2023-10-25 23:20:17
class Solution: # f[t][i] 表示通过恰好 t 次航班,从出发城市 src 到达城市 i 需要的最小花费。 def findCheapestPrice1(self, n: int, flights: List[List[int]], src: int, dst: int, k: int) -> int: f = [[float("inf")] * n for _ in range(k + 2)] f[0][src] = 0 for t in range(1, k + 2): for j, i, cost in flights: f[t][i] = min(f[t][i], f[t - 1][j] + cost) ans = min(f[t][dst] for t in range(1, k + 2)) return -1 if ans == float("inf") else ans def findCheapestPrice(self, n: int, flights: List[List[int]], src: int, dst: int, k: int) -> int: f = [float("inf")] * n f[src] = 0 ans = float("inf") for t in range(1, k + 2): g = [float("inf")] * n for j, i, cost in flights: g[i] = min(g[i], f[j] + cost) f = g ans = min(ans, f[dst]) return -1 if ans == float("inf") else ans
java 解法, 执行用时: 5 ms, 内存消耗: 42.1 MB, 提交时间: 2023-10-25 23:19:12
class Solution { public int findCheapestPrice1(int n, int[][] flights, int src, int dst, int k) { final int INF = 10000 * 101 + 1; int[][] f = new int[k + 2][n]; for (int i = 0; i < k + 2; ++i) { Arrays.fill(f[i], INF); } f[0][src] = 0; for (int t = 1; t <= k + 1; ++t) { for (int[] flight : flights) { int j = flight[0], i = flight[1], cost = flight[2]; f[t][i] = Math.min(f[t][i], f[t - 1][j] + cost); } } int ans = INF; for (int t = 1; t <= k + 1; ++t) { ans = Math.min(ans, f[t][dst]); } return ans == INF ? -1 : ans; } public int findCheapestPrice(int n, int[][] flights, int src, int dst, int k) { final int INF = 10000 * 101 + 1; int[] f = new int[n]; Arrays.fill(f, INF); f[src] = 0; int ans = INF; for (int t = 1; t <= k + 1; ++t) { int[] g = new int[n]; Arrays.fill(g, INF); for (int[] flight : flights) { int j = flight[0], i = flight[1], cost = flight[2]; g[i] = Math.min(g[i], f[j] + cost); } f = g; ans = Math.min(ans, f[dst]); } return ans == INF ? -1 : ans; } }
cpp 解法, 执行用时: 32 ms, 内存消耗: 12.6 MB, 提交时间: 2023-10-25 23:18:38
class Solution { private: static constexpr int INF = 10000 * 101 + 1; public: int findCheapestPrice1(int n, vector<vector<int>>& flights, int src, int dst, int k) { vector<vector<int>> f(k + 2, vector<int>(n, INF)); f[0][src] = 0; for (int t = 1; t <= k + 1; ++t) { for (auto&& flight: flights) { int j = flight[0], i = flight[1], cost = flight[2]; f[t][i] = min(f[t][i], f[t - 1][j] + cost); } } int ans = INF; for (int t = 1; t <= k + 1; ++t) { ans = min(ans, f[t][dst]); } return (ans == INF ? -1 : ans); } int findCheapestPrice(int n, vector<vector<int>>& flights, int src, int dst, int k) { vector<int> f(n, INF); f[src] = 0; int ans = INF; for (int t = 1; t <= k + 1; ++t) { vector<int> g(n, INF); for (auto&& flight: flights) { int j = flight[0], i = flight[1], cost = flight[2]; g[i] = min(g[i], f[j] + cost); } f = move(g); ans = min(ans, f[dst]); } return (ans == INF ? -1 : ans); } };