leetcode 787. K 站中转内最便宜的航班

  1. 题目链接 https://leetcode-cn.com/problems/cheapest-flights-within-k-stops/submissions/

  2. 题目描述

    1. n 个城市通过 m 个航班连接。每个航班都从城市 u 开始,以价格 w 抵达 v

      现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到从 srcdst 最多经过 k 站中转的最便宜的价格。 如果没有这样的路线,则输出 -1

    2. 示例 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,如图中蓝色所示。
  3. 解题思路

    1. 堆:以(到原点的距离, 点, 层次)为基本元素建立最小堆,根据堆顶的顶点更新与顶点相连的边,直到取到目标顶点或是堆空为止。
    2. 动态规划。dp[i][j]为经历了i次航班j点到原点的最小距离
    3. 状态转移方程 dp[i][j] = min(dp[i-1][p] + weights[p][j]]) && p \in [1..n-1]
  4. 代码

    1. 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
      
    2. 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]

猜你喜欢

转载自blog.csdn.net/qq_38043440/article/details/89149034