문제 링크
https://www.acmicpc.net/problem/1238
이번 문제의 태그는 다익스트라, 나에겐 생소한 방식이었기 때문에 다익스트라가 뭔지에 대해 먼저 공부할 필요가 있었다.
다익스트라란?
하나의 정점에서 다른 정점들까지의 최단 거리들을 찾는 최단 경로 알고리즘의 일종이다.
이 때, 힙큐를 함께 사용하여, 해당 정점에서 연결된 정점들 중 거리가 가장 짧은 경로 먼저 계산을 한다.
이렇게 하면 이미 계산딘 경로의 길이보다 더 긴 거리가 있을 시에 스킵할 수 있다.
풀이 방식
전체 코드
from sys import stdin
from sys import maxsize
import heapq
N, M, X = map(int, stdin.readline().split())
graph = {}
for i in range(1, N+1):
graph[i] = []
# 각 마을간의 경로와 거리를 그래프에 저장
for _ in range(M):
start, end, T = map(int, stdin.readline().split())
graph[start].append([end, T])
def dijkstra(i):
queue = []
distance = [maxsize] * (N+1)
# 현재 위치와 이동한 거리 큐, distance에 저장
heapq.heappush(queue, (0, i))
distance[i] = 0
while queue:
# 거리가 짧은 마을의 노드 먼저 계산
dist, village = heapq.heappop(queue)
# 해당 마을의 거리가 이미 최소 거리이면 스킵
if distance[village] < dist:
continue
# 해당 마을에서 연결된 마을들에 대해
for node_village, node_dist in graph[village]:
# 연결된 마을들까지의 거리는 현재 거리 + 해당마을까지의 거리
cost = dist + node_dist
# 연결된 마을까지의 거리보다 cost가 작으면 거리 변경
if distance[node_village] > cost:
distance[node_village] = cost
heapq.heappush(queue, (cost, node_village))
return distance
ans = 0
for i in graph:
if i == X:
continue
# 각 마을에 사는 아이들의 파티 왕복시간 중 최대값 계산
ans = max(dijkstra(i)[X] + dijkstra(X)[i], ans)
print(ans)