coding/알고리즘,자료구조
다익스트라 연습 - 최단경로(백준 1753)
Jeo
2022. 2. 8. 10:07
문제: https://www.acmicpc.net/problem/1753
다익스트라의 전형같은 문제!
코드
import heapq
import sys
n, m = map(int, sys.stdin.readline().split())
s = int(sys.stdin.readline().rstrip())
# 연결 정보 받아오는 중첩리스트
conn_info = [[] for _ in range(n+1)]
for _ in range(m):
u, v, w = map(int, sys.stdin.readline().split())
conn_info[u].append((v, w))
# 초기화에 사용/도달불가한 노드 알아볼 큰 수
INF = int(1e12)
# 최단거리 테이블
min_dis = [INF] * (n+1)
min_dis[s] = 0
# 시작점 미리 넣기 (거리, 해당노드) 튜플로
que = [(0, s)]
while que:
w, it = heapq.heappop(que)
# 이 노드로 오는 경로로 기존에 기록된 것이 더 효율적이라면, 이 경로 무시
if min_dis[it] < w:
continue
# 이 노드에서 다른 인접 노드로 가는 경로에 대한 비용 고려해보고 그 인접노드로 가는 기존 비용보다 적다면 갱신.
# 괜찮은 경로이므로 다음 경유할 때 고려할 수 있을 경로이니 우선순위큐(heapq) 에 넣기
for to_node, d_w in conn_info[it]:
cost = w + d_w
if cost < min_dis[to_node]:
min_dis[to_node] = cost
heapq.heappush(que, (cost, to_node))
for i in range(1, n+1):
if min_dis[i] >= INF:
print("INF")
else:
print(min_dis[i])
+ 실제 어떤 노드를 거쳐야 도출된 최단거리로 갈 수 있는지 알기 위해 '이전 노드' 를 기록하는 것이 추가된 코드
import heapq
import sys
n, m = map(int, sys.stdin.readline().split())
s = int(sys.stdin.readline().rstrip())
# 연결 정보 받아오는 중첩리스트
conn_info = [[] for _ in range(n+1)]
for _ in range(m):
u, v, w = map(int, sys.stdin.readline().split())
conn_info[u].append((v, w))
# 초기화에 사용/도달불가한 노드 알아볼 큰 수
INF = int(1e12)
# 최단거리 테이블
min_dis = [INF] * (n+1)
min_dis[s] = 0
# 이전 노드 테이블
previous_node = [None] * (n+1)
# 시작점 미리 넣기 (거리, 해당노드) 튜플로
que = [(0, s)]
while que:
w, it = heapq.heappop(que)
# 이 노드로 오는 경로로 기존에 기록된 것이 더 효율적이라면, 이 경로 무시
if min_dis[it] < w:
continue
# 이 노드에서 다른 인접 노드로 가는 경로에 대한 비용 고려해보고 그 인접노드로 가는 기존 비용보다 적다면 갱신.
# 괜찮은 경로이므로 다음 경유할 때 고려할 수 있을 경로이니 우선순위큐(heapq) 에 넣기
for to_node, d_w in conn_info[it]:
cost = w + d_w
if cost < min_dis[to_node]:
min_dis[to_node] = cost
previous_node[to_node] = it # 이전 노드 정보 갱신
heapq.heappush(que, (cost, to_node))
for i in range(1, n+1):
if min_dis[i] >= INF:
print("INF")
else:
print(min_dis[i])
# 이전 노드 정보 출력 (디버깅 목적)
print("Previous node:", previous_node)