[LeetCode] 787. Cheapest Flights Within K Stops K次转机内的最便宜航班
There are n
cities connected by m
flights. Each fight starts from city u
and arrives at v
with a price w
.
Now given all the cities and fights, together with starting city src
and the destination dst
, your task is to find the cheapest price from src
to dst
with up to k
stops. If there is no such route, output -1
.
Example 1: Input: n = 3, edges = [[0,1,100],[1,2,100],[0,2,500]] src = 0, dst = 2, k = 1 Output: 200 Explanation: The graph looks like this:
0
2
Example 2: Input: n = 3, edges = [[0,1,100],[1,2,100],[0,2,500]] src = 0, dst = 2, k = 0 Output: 500 Explanation: The graph looks like this:
0
2
Note:
- The number of nodes
n
will be in range[1, 100]
, with nodes labeled from0
ton
- 1
. - The size of
flights
will be in range[0, n * (n - 1) / 2]
. - The format of each flight will be
(src,
dst
, price)
. - The price of each flight will be in the range
[1, 10000]
. k
is in the range of[0, n - 1]
.- There will not be any duplicated flights or self cycles.
Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | class Solution { public int findCheapestPrice( int n, int [][] flights, int src, int dst, int K) { Map<Integer, Map<Integer, Integer>> prices = new HashMap<>(); for ( int [] f : flights) { if (!prices.containsKey(f[ 0 ])) prices.put(f[ 0 ], new HashMap<>()); prices.get(f[ 0 ]).put(f[ 1 ], f[ 2 ]); } Queue< int []> pq = new PriorityQueue<>((a, b) -> (Integer.compare(a[ 0 ], b[ 0 ]))); pq.add( new int [] { 0 , src, k + 1 }); while (!pq.isEmpty()) { int [] top = pq.remove(); int price = top[ 0 ]; int city = top[ 1 ]; int stops = top[ 2 ]; if (city == dst) return price; if (stops > 0 ) { Map<Integer, Integer> adj = prices.getOrDefault(city, new HashMap<>()); for ( int a : adj.keySet()) { pq.add( new int [] {price + adj.get(a), a, stops - 1 }); } } } return - 1 ; } } |
Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | class Solution( object ): def findCheapestPrice( self , n, flights, src, dst, K): """ :type n: int :type flights: List[List[int]] :type src: int :type dst: int :type K: int :rtype: int """ adj = collections.defaultdict( list ) for u, v, w in flights: adj[u].append((v, w)) best = collections.defaultdict( lambda : collections.defaultdict( lambda : float ( "inf" ))) min_heap = [( 0 , src, K + 1 )] while min_heap: result, u, k = heapq.heappop(min_heap) if k < 0 or best[u][k] < result: continue if u = = dst: return result for v, w in adj[u]: if result + w < best[v][k - 1 ]: best[v][k - 1 ] = result + w heapq.heappush(min_heap, (result + w, v, k - 1 )) return - 1 |
Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | class Solution( object ): def findCheapestPrice( self , n, flights, src, dst, K): """ :type n: int :type flights: List[List[int]] :type src: int :type dst: int :type K: int :rtype: int """ f = collections.defaultdict( dict ) for a, b, p in flights: f[a][b] = p heap = [( 0 , src, k + 1 )] while heap: p, i, k = heapq.heappop(heap) if i = = dst: return p if k > 0 : for j in f[i]: heapq.heappush(heap, (p + f[i][j], j, k - 1 )) return - 1 |
C++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | // Time: O((|E| + |V|) * log|V|) = O(|E| * log|V|) // Space: O(|E| + |V|) = O(|E|) class Solution { public : int findCheapestPrice( int n, vector<vector< int >>& flights, int src, int dst, int K) { using P = pair< int , int >; unordered_map< int , vector<P>> adj; for ( const auto & flight : flights) { int u, v, w; tie(u, v, w) = make_tuple(flight[0], flight[1], flight[2]); adj[u].emplace_back(v, w); } unordered_map< int , unordered_map< int , int >> best; using T = tuple< int , int , int >; priority_queue<T, vector<T>, greater<T>> min_heap; min_heap.emplace(0, src, K + 1); while (!min_heap.empty()) { int result, u, k; tie(result, u, k) = min_heap.top(); min_heap.pop(); if (k < 0 || (best.count(u) && best[u].count(k) && best[u][k] < result)) { continue ; } if (u == dst) { return result; } for ( const auto & kvp : adj[u]) { int v, w; tie(v, w) = kvp; if (!best.count(v) || !best[v].count(k - 1) || result + w < best[v][k - 1]) { best[v][k - 1] = result + w; min_heap.emplace(result + w, v, k - 1); } } } return -1; } }; |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构