문제풀이/백준(Boj) 문제풀이

[백준][BFS] 1753. 최단경로 (파이썬/Python)

얄루몬 2021. 11. 9. 15:51

import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**6)

import heapq

n, m = map(int, input().split())

start = int(input())

INF = int(1e9)

graph = [[] * (n+1) for _ in range(n+1)]

distance = [INF] * (n+1)


for _ in range(m):
    u, v, w = map(int, input().split())
    # u에서 v로 가는 거리가 w라는 의미
    graph[u].append((v, w))


def dijkstra(start):
    q = []
    heapq.heappush(q, (0, start))
    distance[start] = 0

    while q:
        dist, now = heapq.heappop(q)
        
        # 현재 노드가 이미 처리된 적이 있는 노드라면 무시
        if distance[now] < dist:
            continue
        # 현재 노드와 연결된 다른 인접한 노드들을 확인
        for i in graph[now]:
            cost = dist + i[1]
            # 현재 노드를 거쳐서, 다른 노드로 이동하는 거리가 더 짧은 경우
            if cost < distance[i[0]]:
                distance[i[0]] = cost
                heapq.heappush(q, (cost, i[0]))


dijkstra(start)


for i in range(1, n+1):
    if distance[i] == INF:
        print("INF")
    else:
        print(distance[i])

다익스트라 알고리즘을 사용해서 풀면 된다.