최단 거리 테이블은 각 노드에 대한 현재까지 최단 거리 정보를 가지고 있다.
한 번 처리된 노드의 최단 거리는 고정 => 그리디
테이블에 각 노드까지의 최단 거리 정보가 저장된다.
INF = int(1e9)
n, m = map(int, input().split())
start = int(input())
visited = [False] * (n+1)
graph = [[] for i in range(n+1)]
distance = [INF] * (n+1) # 최단거리 테이블
for _ in range(m):
a, b, c map(int, input().split())
graph[a].append((b, c)) # b노드로 가는 비용 c
# 방문하지 않은 노드 중 가장 최단 거리가 짧은 노드의 index 반환
def get_smallest_node():
min_value = INF
index = 0
for i in range(1, n+1):
if distance[i] < min_value and not visited[i]:
min_value = distance[i]
index = i
return index
def dijkstra(start):
distance[start] = 0
visted[start] = True
for j in graph[start]:
distance[j[0]] = j[i]
# 시작 노드를 제외한 전체 n - 1 개의 노드에 대해 반복
for i in range(n-1):
now = get_smallest_node()
visited[now] = True
for j in graph[now]:
const = distance[now] + j[1]
if cost < distance[j[0]]:
distance[j[0]] = cost
dijkstra(start)
# 모든 노드로 가기 위한 최단 거리 출력
for i in range(1, n+1):
if distance[i] == INF:
print("INF")
else:
print(distance[i])
import heapq
def heapsort(iterable):
h = []
result = []
for value in iterable:
heapq.heappush(h, value)
for i in range(len(h)):
result.append(heapq.heappop(h))
return result
result = heapsort([1, 3, 5, 7, 9, 2 ..])
print(result)
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]))
INF = int(1e9)
n = int(input())
m = int(input())
graph = [[INF] * (n+1) for _ in range(n+1)]
for a in range(1, n + 1):
for b in range(1, n + 1):
if a==b:
graph[a][b] = 0
for _ in range(m):
a, b, c = map(int, input().split()) # a에서 b로 가는 비용은 c
graph[a][b] = c
for k in range(1, n+1):
for a in range(1, n+1):
for b in range(1, n+1):
graph[a][b] = min(graph[a][b], graph[a][k] + graph[k][b])
for a in range(1, n+1):
for b in range(1, n+1):
if graph[a][b] == INF:
print("INF")
else:
print(graph[a][b], end=' ')
print()