백준 1753 - 최단 경로 (Python3)
코드
import heapq
import sys
# 무한
INF = int(1e9)
# 노드의 개수, 간선으 ㅣ개수
n, m = map(int, input().split())
# 시작 노드
start_node = int(input())
# 각 노드에 연결되어 있는 노드에 대한 정보를 담는 리스트
graph = [[] for _ in range(n+1)]
# 최단 거리 테이블 (무한으로 초기화)
distance = [INF] * (n+1)
# 모든 간선 정보 입력
for _ in range(m):
a, b, c = map(int, input().split())
# a 노드에서 b노드로 가는 비용 : c
graph[a].append((b, c))
# 다익스트라 구현
def dijkstra(start_node):
# 최소힙으로 구현할 것이므로 큐 생성
q = []
# 시작 노드부터 알고리즘이 시작
# 시작 노드에서 시작노드로 가는 비용은 0
# 튜플로값을 넣을 때, (가치, 물건)의 개념으로 입력 => 가치를 기준으로 가치가 우선순위
# 가치가 낮을 수록 먼저 삭제
# 내부적으로 정렬이 돼있지 않으므로 무조건 가치가 낮은 애가 먼저 삭제됨
heapq.heappush(q, (0, start_node))
# 시작 노드의 최단 거리 테이블을 0으로 변경
distance[start_node] = 0
# q가 빌 떄 까지
while q:
# 거리, 현재 있는 노드
dist, now = heapq.heappop(q)
# 현재 노드의 최단 거리 테이블이 dist보다 작다
# 그 뜻은 최단 거리 테이블에 있는 값이 가장 작은 값이다
# 즉 최단 경로에 부합하므로
# 연산을 하지 않고 무시한다
# 초기값이 INF으로 설정한 이유도 이 조건에 걸리게 하기 위함
if distance[now] < dist:
continue
# 현재 노드와 연결된 다른 인접한 노드들 확인
for i in graph[now]:
# 노드까지 이동하는 비용 계산
# dist는 now까지 오는데 쓴 비용
# i[1]은 now에서 i번째 노드까지 가는데 쓰는 비용 (c)
cost = dist + i[1]
# 현재 노드를 거쳐서 다른 노드로 이동하는 거리가 더 짧은 경우
# 즉 cost가 distance[i[0]]보다 더 짧은 경우
# i[0] : 다음 노드
# 즉 distance[다음 노드]가 되고 distance[다음 노드]의 의미는 다음 노드가 갖는 최단 거리 테이블 값이다
if cost < distance[i[0]]:
# 더 작으니까 최단 거리 테이블을 업데이트
distance[i[0]] = cost
# cost : 비용
# i[0] : 노드 (start에서 이동한 다음 노드가 됨)
heapq.heappush(q, (cost, i[0]))
# 다익스트라 수행
dijkstra(start_node)
# 모든 노드로 가기 위한 최단 거리 출력
for i in range(1, n+1):
# 도달할 수 없으면 INF 그대로 출력
if distance[i] == INF:
print('INF')
else:
print(distance[i])
문제 해설
다익스트라 알고리즘 문제이다.
최소힙을 이용하여 시간적인 성능을 개선시킨 방식으로 문제를 해결하였다.
매우 기본에 충실한 문제이므로 몇번이고 분석하고 자주 복습하여 문제를 풀어보고 다른 최단 경로 문제 역시 수월하게 풀 수 있을 만큼 연습해야겠다.
댓글남기기