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