728x90
https://www.acmicpc.net/problem/1753
1753번: 최단경로
첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1 ≤ K ≤ V)가
www.acmicpc.net
기존 다익스트라에서 거친 경로를 구해야 했기 때문에 추가적인 조치를 취해야했다. 또 이미 현재 누적된 가중치가 해당 노드의 가중치의 최솟값보다 크면 미리 중지해 실행 시간을 줄여야했다.
import heapq
def solution(V, E, K, data_list):
# data_list 정리
simple_data = [[] for _ in range(V+1)]
for start, end, weight in data_list:
simple_data[start].append([end, weight])
# 다익스트라 쓸거
# 시스템상 최댓값
inf = 200001
# 가중치
dist = [inf for _ in range(V+1)]
dist[K] = 0
# 힙큐에 부시
hq = []
# 시작이 K 인 데이터 순회
for end, weight in simple_data[K]:
if dist[end] > weight:
heapq.heappush(hq, [weight, end])
dist[end] = weight
# 다익스트라
while True:
# 큐가 비면 끝
if not hq:
break
# 가중치와 현재 노드
now_weight, now_node = heapq.heappop(hq)
# 가중치가 다음 노드의 가중치보다 크면 패스
for next_node, next_weight in simple_data[now_node]:
if now_weight > dist[next_node]:
continue
# 가중치의 합
weight_sum = next_weight + now_weight
# 기존 가중치와 비교
if weight_sum < dist[next_node]:
dist[next_node] = weight_sum
# 힙큐에 푸시
heapq.heappush(hq, [weight_sum, next_node])
for weight in dist[1:]:
if weight == inf:
print("INF")
else:
print(weight)
V, E = map(int, input().split())
K = int(input())
data_list = [list(map(int, input().split())) for _ in range(E)]
solution(V, E, K, data_list)
728x90
'Coding Test > BaekJoon_Python' 카테고리의 다른 글
백준 1007 <벡터 매칭> Python (1) | 2023.11.15 |
---|---|
백준 1005 <ACM Craft> Python (0) | 2023.11.15 |
백준 1238 <파티> Python (1) | 2023.11.14 |
백준 1753 <최단경로> Python (1) | 2023.11.14 |
백준 11725 <트리의 부모 찾기> Python (1) | 2023.11.13 |