기타/코딩테스트
[Python]백준 1753번 - 최단경로
lazy man
2023. 3. 28. 20:34
1. 문제정보
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
2. 해결전략
최단 거리를 구하는 문제이기 때문에 다익스트라 알고리즘을 우선으로 고려했습니다. 다만 간선의 입력이 최대 30만개 이기 때문에 입력 부분을 개선하였습니다.
3. 코드
import sys
import heapq
input = sys.stdin.readline
v, e = map(int, input().split())
start = int(input())
graph = [[] for _ in range(v+1)]
INF = int(1e9)
distance = [INF] * (v+1)
visited = [False] * (v+1)
for _ in range(e):
# a에서 b는 가중치 c
a, b, c = map(int, input().split())
graph[a].append((b,c))
def dijkstra(start):
q = []
# 시작점은 가중치 0
distance[start] = 0
heapq.heappush(q, (0, start))
while q:
# 최단거리가 거리가 가장 짧은 노드 취득
dist, now = heapq.heappop(q)
# 이미 방문했던 노드라면 무시한다.
if visited[now] == True:
continue
# 방문처리
visited[now] = True
# start→j로 이동거리보다 start→now→j로 이통했을 때 거리가 더 짧다면 거리를 갱신한다
for j in graph[now]:
cost = dist + j[1]
if cost < distance[j[0]]:
distance[j[0]] = cost
heapq.heappush(q, (cost, j[0]))
dijkstra(start)
for i in range(1, v+1):
if distance[i] == INF:
print("INF")
else:
print(distance[i])