[백준_Python] 1753번 최단경로 [골드 4]

황준성·2024년 12월 18일
0

BOJ_Python

목록 보기
42/70

문제

입력

첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1 ≤ K ≤ V)가 주어진다. 셋째 줄부터 E개의 줄에 걸쳐 각 간선을 나타내는 세 개의 정수 (u, v, w)가 순서대로 주어진다. 이는 u에서 v로 가는 가중치 w인 간선이 존재한다는 뜻이다. u와 v는 서로 다르며 w는 10 이하의 자연수이다. 서로 다른 두 정점 사이에 여러 개의 간선이 존재할 수도 있음에 유의한다.

출력

첫째 줄부터 V개의 줄에 걸쳐, i번째 줄에 i번 정점으로의 최단 경로의 경로값을 출력한다. 시작점 자신은 0으로 출력하고, 경로가 존재하지 않는 경우에는 INF를 출력하면 된다.

입력 예시 1

5 6
1
5 1 1
1 2 2
1 3 3
2 3 4
2 4 5
3 4 6

출력 예시 1

0
2
3
7
INF

문제 이해

다익스트라 알고리즘을 배우고 처음으로 푼 문제이다. 그냥 다익스트라의 기본적인 구현을 다루는 문제여서 다익스트라 개념만 적용하면 된다.

알고리즘 공부를 시작하고 지금까지 DFS, BFS, 다익스트라 알고리즘 순서대로 배우고 있으면서 느끼는 점은, 알고리즘 문제는 기본 개념문제여도 난이도가 높게 배정되는 것 같다. DFS/BFS문제는 기본이 실버 4에서 조금 활용하면 골드 4정도의 난이도이다. 지금 다익스트라 알고리즘 기본 문제인 현재 문제가 골드 4인걸 보면 수준 높다고 생각되는 알고리즘 문제는 기본 난이도를 올려치기 하는 것 같다. 사실 다익스트라 알고리즘을 이해하는 것은 그렇게 어렵지 않았기 때문에 그렇게 생각되는 것 같기도하다. 차라리 DFS를 처음 이해할때가 훨씬 어려웠지만 DFS문제는 활용이라도 실버 1정도여서 다익스트라가 좀 올려치기 인 것 같기도 하다. 그럼 아마 다익스트라 활용은 골드 1에서 플레티넘 4정도가 아닐까 싶다.

코드

#백준 1753번 최단경로 - 처음푸는 다익스트라 문제

# 읽는 속도 효율화
import sys
input = sys.stdin.readline

# 힙을 파이썬에서 구현
from queue import PriorityQueue

INF = int(1e12)

# 0. 입력 및 초기화
V, E = map(int, input().split()) #V정점, E간선선
start_node = int(input())
graph = [[] for _ in range(V+1)] # adj_list 인접 리스트
distance = [INF] * (V+1) # 각 정점까지의 거리리

# 1. 연결 정보 입력
for i in range(E):
    u, v, w = map(int, input().split())
    graph[u].append([v, w]) # 리스트 형태로 넣어준다

# 2. Excute Dijkstra Algorithm
pq = PriorityQueue() # pq라는 이름의 힙을 구현
pq.put([0, start_node])
distance[start_node] = 0 # 시작점은 거리가 0

# 힙에 값이 없을 때까지 반복
while not pq.empty():
    # 힙에서 값을 꺼낸다
    cur_distance, cur_node = pq.get()

    for adj_node, adj_distance in graph[cur_node]:

        temp_distance = cur_distance + adj_distance

        if temp_distance < distance[adj_node]:

            distance[adj_node] = temp_distance
            pq.put([temp_distance, adj_node])

# Print result 
for i in  range(1, V+1):
    if distance[i] == INF:
        print("INF")
        continue
    print(distance[i])
profile
Make progress

0개의 댓글