-
题目链接 https://leetcode-cn.com/problems/cheapest-flights-within-k-stops/submissions/
-
题目描述
-
有
n
个城市通过m
个航班连接。每个航班都从城市u
开始,以价格w
抵达v
。现在给定所有的城市和航班,以及出发城市
src
和目的地dst
,你的任务是找到从src
到dst
最多经过k
站中转的最便宜的价格。 如果没有这样的路线,则输出-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,如图中蓝色所示。
-
-
解题思路
- 堆:以(到原点的距离, 点, 层次)为基本元素建立最小堆,根据堆顶的顶点更新与顶点相连的边,直到取到目标顶点或是堆空为止。
- 动态规划。dp[i][j]为经历了i次航班j点到原点的最小距离
- 状态转移方程
-
代码
- 堆
class Solution: def findCheapestPrice(self, n, flights, src, dst, K): import heapq weights = [[float("inf")] * n for _ in range(n)] for u, v, w in flights: weights[u][v] = w heap = [(0, src, -1)] # dis, point, layer vis = [0] * n while heap: dis, point, layer = heapq.heappop(heap) vis[point] = 1 if point == dst: return dis if layer < K: for i in range(n): if weights[point][i] != float('inf'): heapq.heappush(heap, (dis+weights[point][i], i, layer+1)) return -1
- DP
class Solution: def findCheapestPrice(self, n, flights, src, dst, K): dp = [[float("inf")] * n for _ in range(K+2)] for i in range(K+2): dp[i][src] = 0 for i in range(K+1): for u, v, w in flights: if dp[i][u] != float('inf'): dp[i+1][v] = min(dp[i+1][v], dp[i][u] + w) return -1 if dp[-1][dst] == float("inf") else dp[-1][dst]
- 堆
leetcode 787. K 站中转内最便宜的航班
猜你喜欢
转载自blog.csdn.net/qq_38043440/article/details/89149034
今日推荐
周排行