본문 바로가기
Algorithm/LEET CODE ( 파이썬 알고리즘 인터뷰)

[LEET CODE] 787. Cheapest Flights Within K Stops ( 다익스트라 알고리즘 )

by newnu 2021. 4. 14.
반응형

# Problem

There are n cities connected by m flights. Each flight starts from city u and arrives at v with a price w.

Now given all the cities and flights, 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.

Constraints:

  • The number of nodes n will be in range [1, 100], with nodes labeled from 0 to n - 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.

 

# My Answer

import collections
import heapq
class Solution:
    def findCheapestPrice(self, n: int, flights: List[List[int]], src: int, dst: int, K: int) -> int:
        route = collections.defaultdict(dict)
        for u,v,w in flights:
            route[u][v] = w
        dist = collections.defaultdict(dict)
        queue = []
        queue.append((src,0,0))
        while queue:
            node,edge, price = heapq.heappop(queue) 
            temp = dist[node].values()
            if edge > K+1 :   # 경유지 수 넘어가면 skip
                continue
            if temp and price > min(temp): # 현재 값보다 들어온 price가 크면 skip
                continue
            if edge not in dist[node].keys() or dist[node][edge]>price:
                dist[node][edge]=price # 경유지 수, 가격 저장
            d = edge+1
            for v,w in route[node].items(): 
                p = price + w
                heapq.heappush(queue,(v,d,p))
        if dist[dst]:
            return min(dist[dst].values())
        else:
            return -1
        

 

# Solution 1 - 다익스트라 알고리즘 응용

import collections
import heapq

class Solution:
    def findCheapestPrice(self, n: int, flights: List[List[int]], src: int, dst: int, K: int) -> int:
        graph = collections.defaultdict(list)
        # 그래프 인접 리스트 구성
        for u, v, w in flights:
            graph[u].append((v, w))

        # 큐 변수: [(가격, 정점, 남은 가능 경유지 수)]
        Q = [(0, src, K)]

        # 우선 순위 큐 최소값 기준으로 도착점까지 최소 비용 판별
        while Q:
            price, node, k = heapq.heappop(Q) # price 기준 우선순위
            if node == dst:
                return price
            if k >= 0:
                for v, w in graph[node]:
                    alt = price + w
                    heapq.heappush(Q, (alt, v, k - 1))
        return -1

heappop()은 인덱스 0 기준으로 우선순위 순으로 pop

이 문제에서는 price 가 최소가 되어야 하므로 우선순위는 price 기준으로 해야함

price 순으로 가장 작은 값이 나오므로 node가 dst가 되면 그 때가 최소값임

반응형