Cheapest Flights Within K Stops

medium graph dp bfs shortest path

Problem

n cities and flights[i] = [from, to, price]. Find the cheapest price from src to dst using at most K stops (so K + 1 edges). Return −1 if no such route exists.

Inputflights = [[0,1,100],[1,2,100],[0,2,500]], n = 3, src = 0, dst = 2, K = 1
Output200
0 → 1 → 2 has 1 stop and total cost 200; cheaper than the direct 500.

def find_cheapest_price(n, flights, src, dst, K):
    INF = float('inf')
    dist = [INF] * n
    dist[src] = 0
    for _ in range(K + 1):
        snap = dist[:]
        for u, v, w in flights:
            if snap[u] + w < dist[v]:
                dist[v] = snap[u] + w
    return -1 if dist[dst] == INF else dist[dst]
function findCheapestPrice(n, flights, src, dst, K) {
  const INF = Infinity;
  let dist = new Array(n).fill(INF);
  dist[src] = 0;
  for (let i = 0; i <= K; i++) {
    const snap = dist.slice();
    for (const [u, v, w] of flights) {
      if (snap[u] + w < dist[v]) dist[v] = snap[u] + w;
    }
  }
  return dist[dst] === INF ? -1 : dist[dst];
}
class Solution {
    public int findCheapestPrice(int n, int[][] flights, int src, int dst, int K) {
        int[] dist = new int[n];
        Arrays.fill(dist, Integer.MAX_VALUE);
        dist[src] = 0;
        for (int i = 0; i <= K; i++) {
            int[] snap = dist.clone();
            for (int[] e : flights) {
                if (snap[e[0]] == Integer.MAX_VALUE) continue;
                if (snap[e[0]] + e[2] < dist[e[1]]) dist[e[1]] = snap[e[0]] + e[2];
            }
        }
        return dist[dst] == Integer.MAX_VALUE ? -1 : dist[dst];
    }
}
class Solution {
public:
    int findCheapestPrice(int n, vector<vector<int>>& flights, int src, int dst, int K) {
        const int INF = INT_MAX;
        vector<int> dist(n, INF);
        dist[src] = 0;
        for (int i = 0; i <= K; i++) {
            vector<int> snap = dist;
            for (auto& e : flights) {
                if (snap[e[0]] == INF) continue;
                if (snap[e[0]] + e[2] < dist[e[1]]) dist[e[1]] = snap[e[0]] + e[2];
            }
        }
        return dist[dst] == INF ? -1 : dist[dst];
    }
};
Time: O(K · E) Space: O(n)