import sys
input = sys.stdin.readline
INF = int(1e9)
n, m = map(int, input().split()) #노드 갯수, 간선 갯수
start = int(input()) #시작 노드 번호
graph = [[] for _ in range(n+1)] #노드정보 그래프
visited = [False] * (n+1) #방문 초기값은 모두 false
distance = [INF] * (n+1) #초기 거리는 모두 무한대
for i in range(m):
a, b, c = map(int, input().split()) #a노드 -> b노드, c비용
graph[a].append((b,c))
#방문하지 않은 노드중에서 최단거리가 짧은 노드의 번호 반환
def get_smallest_node():
min_value = INF
node_index = 0
for i in range(1,n+1): #각 노드 방문
if distance[i] < min_value and not visited[i]:
min_value = distance[i]
node_index = i
return node_index
def dijkstra(start):
#초기 노드 설정
distance[start] = 0 #시작 노드의 거리는 0으로
visited[start] = True #방문 처리
print('distance',distance)
for j in graph[start]: #[(a,b), (c,d)]
#j[0]은 인접 노드 번호, j[1]은 거리
distance[j[0]] = j[1] #인접노드의 거리를 지정해줌
print('distance',distance)
#시작노드를 제외한 전체 노드에 대해 반복
for _ in range(n-1):
now = get_smallest_node() #노드 인덱스 반환
print('now', now)
visited[now] = True #노드 방문처리
print('visited', visited)
for j in graph[now]: #[(a,b), (c,d)]
#j[0]은 인접 노드 번호, j[1]은 거리
newDistance = distance[now] + j[1] #새로운 거리는 현재노드까지의 거리 + 현재노드에서 인접노드까지의 거리
distance[j[0]] = min(distance[j[0]], newDistance) #기존 거리와 새로운 거리중 작은걸 선택
print('distance', distance)
print(graph)
dijkstra(start)
for i in range(1, n+1):
if distance[i] == INF:
print('INFINITY')
else:
print(distance[i])
1 - 2,3,4 // 2 - 3,4 // 3 - 2,5 // 4 - 3,5 // 5 - 3,6
최종적으로 구하고자 하는것은 1번노드에서부터 각 노드까지의 최단 거리이므로
graph배열을 반복하여 값이 INF와 같으면 INFINITY를, 아니면 해당 값을 출력