카테고리 없음

다익스트라 알고리즘 (백준 1753번: 최단경로)

virbr0.net 2024. 1. 23. 00:07

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 sys
import heapq

def dijkstra(graph, start):
    n = len(graph)

    # 최초 거리를 무한으로 설정
    dist = [float('inf')] * n

    # 시작점의 거리는 0
    dist[start] = 0
    # 시작점을 큐에 추가
    heap = [(0, start)]
    while heap:
        # u : 지금 방문한 노드
        # d : 시작점에서 u 까지의 거리
        # v : u 에서 연결 된 노드 (다음에 방문할 노드)
        # w : u -> v 까지의 거리
        # dist[u] : 지금까지 계산한 u 까지의 최소 거리
        # dist[v] : 지금까지 계산한 v 까지의 최소 거리
        
        # 방문할 노드 꺼냄
        (d, u) = heapq.heappop(heap)

        # 이전에 더 가깝게 방문했다면 패스
        if d > dist[u]:
            continue

        # 연결된 노드 들을 확인
        for w, v in graph[u]:
            # 방문한 노드까지의 거리 + 다음 노드 까지의 거리가 이전에 계산한 값보다 짧으면,
            # 거리값을 저장 후 우선순위 큐에 저장
            if dist[u] + w < dist[v]:
                dist[v] = dist[u] + w
                heapq.heappush(heap, (dist[v], v))
    return dist

input=sys.stdin.readline
V, E = map(int, input().split())
# 정점(노드)의 번호가 1번 부터 시작 해서 1 뺌
K = int(input()) - 1

graph = [[] for _ in range(V)]

for _ in range(E):
    u, v, w = map(int, input().split())
    graph[u-1].append((w, v-1))

dist = dijkstra(graph, K)

for i in range(V):
    if dist[i] == float('inf'):
        print("INF")
    else:
        print(dist[i])


'''
예제 입력
5 6
1
5 1 1
1 2 2
1 3 3
2 3 4
2 4 5
3 4 6

예제 출력
0
2
3
7
INF
'''