최단 거리 알고리즘
- 다익스트라 알고리즘
그래프에서 여러 개의 노드가 있을 때, 특정한 노드에서 출발하여 다른 노드로 가는 각각의 최단 경로를 구해주는 알고리즘- 플로이드 워셜 알고리즘
모든 지점에서 다른 모든 지점까지의 최단 경로를 모두 구해야 하는 경우- 벨만 포드 알고리즘
화성 탐사 기계가 존재하는 공간은 N x N 크기의 2차원 공간이며, 각각의 칸을 지나기 위한 비용(에너지 소모량)이 존재합니다. 가장 왼쪽 위 칸인 [0][0] 위치에서 가장 오른쪽 아래 칸인 [N-1][N-1] 위치로 이동하는 최소 비용을 출력하는 프로그램을 작성하세요. 화성 탐사 기계는 특정한 위치에서 상하좌우 인접한 곳으로 1칸씩 이동할 수 있습니다.
3
3
5 5 4
3 9 1
3 2 7
5
3 7 2 0 1
2 8 0 9 1
1 2 1 8 1
9 8 9 2 0
3 6 5 1 5
7
9 0 5 1 1 5 3
4 1 2 1 6 5 3
0 7 6 1 6 8 5
1 1 7 8 3 2 3
9 4 0 7 6 4 1
5 8 3 2 4 8 3
7 4 8 4 8 3 4
20
19
36
다익스트라 최단 경로 알고리즘을 이용하여 해결한다. 상하좌우로 이동하는 경우를 다 구한다.
import heapq
import sys
input = sys.stdin.readline
INF = int(1e9)
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
for T in range(int(input())):
N = int(input())
graph = []
for i in range(N):
graph.append(list(map(int, input().split())))
distance = [[INF] * N for _ in range(N)]
x, y = 0, 0
q = [(graph[x][y], x, y)]
distance[x][y] = graph[x][y]
while q:
dist, x, y = heapq.heappop(q)
if distance[x][y] < dist:
continue
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if nx < 0 or nx >= N or ny < 0 or ny >= N:
continue
cost = dist + graph[nx][ny]
if cost < distance[nx][ny]:
distance[nx][ny] = cost
heapq.heappush(q, (cost, nx, ny))
print(distance[N-1][N-1])