- 현재 가장 가까운 노드를 저장하기 위해 우선순위 큐를 이용
- 시간 복잡도 :
O(E*logV)
, E
개의 원소를 우선순위 큐에 넣었다가 모두 빼내는 연산 : O(E*logE)
E <= V^2
이므로 O(E*logE) = O(E*logV^2) = O(E*logV)
import heapq
INF = int(1e9)
n, m = map(int, input().split())
start = int(input())
adj_list = [[] for _ in range(n + 1)]
min_dist_table = [INF] * (n + 1)
for _ in range(m):
i, j, w = map(int, input().split())
adj_list[i].append((j, w))
def dijkstra(start):
pri_queue = []
heapq.heappush(pri_queue, (0, start))
min_dist_table[start] = 0
while pri_queue:
dist, now = heapq.heappop(pri_queue)
if min_dist_table[now] < dist:
continue
for adj_node in adj_list[now]:
cost = dist + adj_node[1]
if cost < min_dist_table[adj_node[0]]:
min_dist_table[adj_node[0]] = cost
heapq.heappush(pri_queue, (cost, adj_node[0]))
dijkstra(start)
for i in range(1, n + 1):
if min_dist_table[i] == INF:
print("inf")
else:
print(min_dist_table[i])
'''
6 11
1
1 2 2
1 3 5
1 4 1
2 3 3
2 4 2
3 2 3
3 6 5
4 3 3
4 5 1
5 3 1
5 6 2
'''