import sys
import heapq
input = sys.stdin.readline
INF = int(1e9)
N, M = map(int, input().strip().split())
start = int(input())
graph = [[] for _ in range(N+1)]
distance = [INF]*(N+1)
for i in range(N):
a, b, c = map(int, input().strip().split())
graph[a].append((b,c))
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])
graph 배열에는 아래 내용이 포함된다.
A노드에서 B노드로 가는 비용 C
예시) 1번 -> 2번 / 비용 3
1번 -> 3번 / 비용 1
2번 -> 4번 / 비용 4
distance 배열은 start노드를 기준으로 각 노드까지의 거리이다.
처음 heapq에 start노드까지의 거리가 0이라고 넣어준다.
while문은 q배열이 있는 동안 무한 루프가 되며, dist와 now에 heappop을 이용하여 값을 넣어준다.
현재 노드 distance[now]가 꺼낸 dist보다 작다면 해당 노드는 이미 처리가 된 것이다.
만약 처리가 되지 않았다면 위에서 저장한 graph배열에서 현재 노드로부터 다른 노드까지의 값들을 가지고 계산을 한다.
예를 들어, graph[1]이라는 배열 안에는 아래의 값들이 포함되어 있다.
(2, 3) -> 2번 노드로 가는데 비용 3
(3, 1) -> 3번 노드로 가는데 비용 1
(4, 4) -> 4번 노드로 가는데 비용 4
for문을 통해 각 요소에 접근하고 dist와 i [1]을 합쳐 비용을 계산한다.
만약 현재 distance[i[0]]보다 비용이 작다면 갱신을 하고 heapq에 넣어준다.
'Dev > 알고리즘' 카테고리의 다른 글
[python] zip을 이용한 단어 비교 (0) | 2021.11.06 |
---|---|
[최소 힙] 파이썬 코드 및 그림 설명 (0) | 2021.11.02 |
[BFS] 백준 7576 토마토 설명 (python) (0) | 2021.10.27 |
[DFS] 기본 (0) | 2021.10.21 |
계산 시간 (백준 10818) (0) | 2018.05.02 |