

문제 출처: https://www.acmicpc.net/problem/1753
난이도 : 골드 4
정점 V개, 간선 E개인 방향 그래프가 주어지고, 시작 정점 K에서 출발해서
모든 정점까지의 최단거리를 출력하는 문제다.
INF즉, “한 점에서 모든 점까지 최단거리” + “가중치 있음(양수)” 조합이면
해결 알고리즘은 다익스트라를 써야 한다.
다익스트라 알고리즘은
가중치가 음수가 없는 그래프에서 한 정점으로부터의 최단 경로를 구하는 알고리즘이다.
특정 정점에서 다른 모든 정점까지 갈때 필요한 최단경로를 알 수 있게 된다.
핵심 컨셉은 하나:
이걸 빠르게 하기 위해 우선순위 큐(힙) 를 사용한다.
graph[u] = [(v, w), ...] 형태의 인접 리스트dist[v] : 시작점에서 특정노드(v)까지의 현재 최단거리(처음엔 INF)heap : (거리, 정점)을 넣는 최소 힙dist[K] = 0(0, K) 넣고 시작(cur_dist, u)를 꺼낸다 (현재 가장 짧은 후보)cur_dist > dist[u]면 continue new_dist = cur_dist + wimport sys
input = sys.stdin.readline
import heapq
INF = 1e9
V, E = map(int,input().split()) # V 정점의 개수, E 간선의 개수
K = int(input()) # K 시작 정점의 번호
graph = [
[] for _ in range(V+1)
]
for _ in range(E):
u, v, w = map(int,input().split())
graph[u].append((v,w)) # 노드 u에 (도착지,가중치) 형식으로 저장
dist = [INF] * (V+1) # 시작점 K에서부터 v까지의 현재 최단거리
dist[K] = 0 # K -> K 는 0
queue = []
heapq.heappush(queue,(0,K)) # queue 큐에 (현재까지의 거리, 현재 노드) 를 넣는다.
while queue:
cur_dist, u = heapq.heappop(queue) # cur_dist 현재까지의 거리, u 현재 노드
# 이미 더 짧은 거리로 갱신된 적이 있다면 스킵
if cur_dist > dist[u]:
continue
for v, w in graph[u]: # 현재 노드의 v 다음 노드, w 가중치
new_dist = cur_dist + w # 새 거리 = 현재까지의 거리 + 가중치
if new_dist < dist[v]:
dist[v] = new_dist # 만약 새 거리가 기존 거리보다 가깝다면 갱신
heapq.heappush(queue,(new_dist, v)) # 새 거리, 새 노드 큐의 넣기
for i in range(1, V+1):
if dist[i] == INF:
print("INF")
else:
print(dist[i]) # 시작점 K 부터 i까지의 최단거리