LeetCode 787. Cheapest Flights Within K Stops

LeetCode 787

第一个思路是通过BFS,搜索最多k个stop的范围,然后找到最便宜的结果。

    def findCheapestPrice2(self, n: int, flights: List[List[int]], src: int, dst: int, K: int) -> int:
        fmap = collections.defaultdict(list)
        for s, d, p in flights:
            fmap[s].append([d, p])
        
        visited = set()
        q = [[src, 0, 0]]
        result = sys.maxsize
        while q:
            csrc, ccost, cstep = q.pop(0)

            if ccost < result and cstep <=K and csrc != dst:
                for nx in fmap[csrc]:
                    q.append([nx[0], ccost + nx[1], cstep + 1])

            if csrc == dst:
                result = min(result, ccost)
        
        if result == sys.maxsize:
            return -1
        return result

另外一种方法是使用DP的算法,使用一个数组记录从起点到每个城市的最小价格,初始都是最大值 (起始城市除外,自己到自己的价格是0)。然后遍历每个可以飞的路径,如果使用这个路径能够得到比原来更便宜的价格,就替换上去。这样循环k次之后,得到的到目的地的最低的价格。

        dist = [sys.maxsize]*(n+1)
        dist[src] = 0
        for _ in range(K+1):
            copy = dist.copy()
            for s, d, p in flights:
                dist[d] = min(dist[d], copy[s] + p)
        
        return dist[dst] if dist[dst] < sys.maxsize else -1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值