D킬로미터의 도로에 N개의 지름길이 존재한다고 했을 때, 출발지에서부터 목적지까지 운전하는 최소 거리를 구하는 문제다.
지름길은 시작 지점, 끝 지점, 지름길의 길이 형태로 주어지며, 모든 지름길의 시작 지점은 끝 지점보다 앞에 위치한다(역주행 X).
처음 시도했던 방법은 각 지름길의 시작 지점과 끝 지점, 도로의 시작 지점과 끝 지점을 노드로 설정하고 각 지점간의 거리를 비용으로 한 가중치 그래프를 생성하고 다익스트라를 적용하는 방법이었다.
하지만 코드를 작성하다 보니 알고리즘을 적용시키기 위해 데이터를 설정하는 과정이 복잡하다고 느꼈다.(배보다 배꼽이 더 크다는 느낌..)
대충 정리해보자면
위 과정을 거치면 공간복잡도 면에서 이득을 보겠지만 그만큼 시간복잡도 면에선 손해를 본다.
따라서 모든 구간을 노드로 설정하기로 했다.
import sys
read = sys.stdin.readline
import heapq
N, D = map(int, read().split())
graph = [[] for _ in range(D + 1)]
distance = [sys.maxsize] * (D + 1)
for i in range(D):
graph[i].append((i + 1, 1))
for _ in range(N):
start, end, length = map(int, read().split())
if end <= D and length < end - start:
graph[start].append((end, length))
heap = []
heapq.heappush(heap, (0, 0))
distance[0] = 0
while heap:
n1, d1 = heapq.heappop(heap)
for n2, d2 in graph[d1]:
cost = distance[d1] + d2
if cost < distance[n2]:
distance[n2] = cost
heapq.heappush(heap, (cost, n2))
print(distance[D])