-
Notifications
You must be signed in to change notification settings - Fork 327
Open
Description
문제점
책에 있는 풀이를 제출했을 때 TLE가 발생합니다.
제출 코드
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)
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
제출 결과
사용한 테스트 케이스
leetcode에서 채점을 위해 사용되어지는 테케입니다.
13
[[11,12,74],[1,8,91],[4,6,13],[7,6,39],[5,12,8],[0,12,54],[8,4,32],[0,11,4],[4,0,91],[11,7,64],[6,3,88],[8,5,80],[11,10,91],[10,0,60],[8,7,92],[12,6,78],[6,2,8],[4,3,54],[3,11,76],[3,12,23],[11,6,79],[6,12,36],[2,11,100],[2,5,49],[7,0,17],[5,8,95],[3,9,98],[8,10,61],[2,12,38],[5,7,58],[9,4,37],[8,6,79],[9,0,1],[2,3,12],[7,10,7],[12,10,52],[7,2,68],[12,2,100],[6,9,53],[7,4,90],[0,5,43],[11,2,52],[11,8,50],[12,4,38],[7,9,94],[2,7,38],[3,7,88],[9,12,20],[12,0,26],[10,5,38],[12,8,50],[0,2,77],[11,0,13],[9,10,76],[2,6,67],[5,6,34],[9,7,62],[5,3,67]]
10
1
10
제가 생각하는 문제의 원인
- 이 풀이는 다익스트라를 살짝 변형했지만 사실 완전 탐색에 가까운 풀이입니다. 다익스트라 알고리즘은 heap에서 꺼낸 노드가 이미 계산이 끝난 노드면 더 이상 방문하지 않지만 이 풀이는 dst를 만나지 못하고 k가 0보다 크기만 하면 방문하므로 중복 탐색이 발생합니다.
- k가 9이고 n이 최대인 100이라고 가정했을 때 src를 포함한 50개의 노드는 모두 서로 간선으로 연결되어 있고 dst를 포함한 나머지 노드들은 나가는 간선도 들어오는 간선도 없다고 가정하면 이루어지는 탐색의 수는 대략 49^10이 됩니다.
궁금한 점
이 풀이를 어떻게 개선해야할지 궁금합니다.
dalinaum
Metadata
Metadata
Assignees
Labels
No labels