|  | 
|  | 1 | +# 787. [Cheapest Flights Within K Stops](https://leetcode.com/problems/cheapest-flights-within-k-stops/) | 
|  | 2 | + | 
|  | 3 | +## Approach 1: DFS with Pruning | 
|  | 4 | + | 
|  | 5 | +### Solution | 
|  | 6 | +```python | 
|  | 7 | +# Time Complexity: O(n^k) in the worst case | 
|  | 8 | +# Space Complexity: O(n) | 
|  | 9 | +from collections import defaultdict | 
|  | 10 | + | 
|  | 11 | +class Solution: | 
|  | 12 | +    def __init__(self): | 
|  | 13 | +        self.result = float('inf') | 
|  | 14 | + | 
|  | 15 | +    def findCheapestPrice(self, n, flights, src, dst, K): | 
|  | 16 | +        # Create adjacency map for graph edges | 
|  | 17 | +        graph = defaultdict(dict) | 
|  | 18 | +        for u, v, price in flights: | 
|  | 19 | +            graph[u][v] = price | 
|  | 20 | + | 
|  | 21 | +        # Perform DFS | 
|  | 22 | +        self.dfs(graph, src, dst, K + 1, 0) | 
|  | 23 | + | 
|  | 24 | +        return -1 if self.result == float('inf') else self.result | 
|  | 25 | + | 
|  | 26 | +    def dfs(self, graph, node, dst, stops, cost): | 
|  | 27 | +        if node == dst: | 
|  | 28 | +            self.result = cost | 
|  | 29 | +            return | 
|  | 30 | + | 
|  | 31 | +        if stops == 0: | 
|  | 32 | +            return  # No more stops available | 
|  | 33 | + | 
|  | 34 | +        if node not in graph: | 
|  | 35 | +            return  # No outgoing flights | 
|  | 36 | + | 
|  | 37 | +        for neighbor, price in graph[node].items(): | 
|  | 38 | +            # Pruning: proceed only if this path is cheaper than the best found so far | 
|  | 39 | +            if cost + price > self.result: | 
|  | 40 | +                continue | 
|  | 41 | + | 
|  | 42 | +            self.dfs(graph, neighbor, dst, stops - 1, cost + price) | 
|  | 43 | +``` | 
|  | 44 | + | 
|  | 45 | +## Approach 2: Bellman-Ford Algorithm | 
|  | 46 | + | 
|  | 47 | +### Solution | 
|  | 48 | +```python | 
|  | 49 | +# Time Complexity: O(K * E), where E is the number of edges | 
|  | 50 | +# Space Complexity: O(n) | 
|  | 51 | +import sys | 
|  | 52 | + | 
|  | 53 | +class Solution: | 
|  | 54 | +    def findCheapestPrice(self, n, flights, src, dst, K): | 
|  | 55 | +        prices = [sys.maxsize] * n | 
|  | 56 | +        prices[src] = 0 | 
|  | 57 | + | 
|  | 58 | +        # Relax the edges up to K+1 times | 
|  | 59 | +        for _ in range(K + 1): | 
|  | 60 | +            temp_prices = prices[:] | 
|  | 61 | +            for u, v, price in flights: | 
|  | 62 | +                if prices[u] == sys.maxsize: | 
|  | 63 | +                    continue | 
|  | 64 | + | 
|  | 65 | +                if prices[u] + price < temp_prices[v]: | 
|  | 66 | +                    temp_prices[v] = prices[u] + price | 
|  | 67 | +            prices = temp_prices | 
|  | 68 | + | 
|  | 69 | +        return -1 if prices[dst] == sys.maxsize else prices[dst] | 
|  | 70 | +``` | 
|  | 71 | + | 
|  | 72 | +## Approach 3: Dijkstra's Algorithm with Priority Queue | 
|  | 73 | + | 
|  | 74 | +### Solution | 
|  | 75 | +```python | 
|  | 76 | +# Time Complexity: O(E + VlogV), where E is the number of edges and V is the number of vertices | 
|  | 77 | +# Space Complexity: O(n) | 
|  | 78 | +import heapq | 
|  | 79 | +from collections import defaultdict | 
|  | 80 | + | 
|  | 81 | +class Solution: | 
|  | 82 | +    def findCheapestPrice(self, n, flights, src, dst, K): | 
|  | 83 | +        # Create an adjacency list for the graph | 
|  | 84 | +        graph = defaultdict(list) | 
|  | 85 | +        for u, v, price in flights: | 
|  | 86 | +            graph[u].append((v, price)) | 
|  | 87 | + | 
|  | 88 | +        # Priority queue will hold entries of (cost, node, stops remaining) | 
|  | 89 | +        pq = [(0, src, K + 1)] | 
|  | 90 | + | 
|  | 91 | +        while pq: | 
|  | 92 | +            cost, node, stops_remaining = heapq.heappop(pq) | 
|  | 93 | + | 
|  | 94 | +            if node == dst: | 
|  | 95 | +                return cost | 
|  | 96 | + | 
|  | 97 | +            if stops_remaining > 0: | 
|  | 98 | +                if node not in graph: | 
|  | 99 | +                    continue | 
|  | 100 | +                for next_node, price_to_next in graph[node]: | 
|  | 101 | +                    heapq.heappush(pq, (cost + price_to_next, next_node, stops_remaining - 1)) | 
|  | 102 | + | 
|  | 103 | +        return -1  # No valid path found | 
|  | 104 | +``` | 
|  | 105 | + | 
0 commit comments