import heapq
import sys
INF =int(1e9)
input = sys.stdin.readline
dx = [0,0,-1,1]
dy = [1,-1,0,0]
tastcase = 1
def dijsktra():
q = []
heapq.heappush(q,(graph[0][0],0,0)) #cost, 시작위치 graph[0][0]을 넣어줌
dist[0][0] = 0
while q:
cost, x,y = heapq.heappop(q)
if x == n-1 and y == n-1: #도착했다면?
print(f"Problem {tastcase}: {dist[x][y]}")
break
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < n and 0 <= ny < n:
newCost = cost + graph[nx][ny]
#새로운 cost가 현재까지의 cost보다 작다면 그쪽으로 진행한다.
if newCost < dist[nx][ny]:
dist[nx][ny] = newCost
heapq.heappush(q,(newCost,nx,ny))
while True:
n = int(input())
if n == 0:
break
graph = []
dist = [[INF] * n for _ in range(n)]
for i in range(n):
graph.append(list(map(int,input().split())))
dijsktra()
tastcase += 1
# 최소 비용을 구하는 문제인데, 이때 가중치가 존재하기 때문에 BFS로는 구할 수 없다.
# 각 노드에서 4방향을 다 돌면서 가장 작은 비용으로 이동하는 곳으로 옮겨가며 진행한다.
# 위의 코드에서 dist --> minCost를 의미한다 !
# 또한 다익스트라 알고리즘은 heap을 사용해서 푼다. (BFS는 deque)
# heap은 완전 이진 트리의 일종으로 우선 순위 큐를 위해 만들어진 자료구조이다.
# heap은 최댓값 최솟값을 찾기 위해 만들어졌다.
'문제풀이 > 백준(Boj) 문제풀이' 카테고리의 다른 글
[백준][구현] 1009.분산처리 (파이썬/Python) (0) | 2022.01.05 |
---|---|
[백준][DFS/BFS] 2583. 영역 구하기 (파이썬/Python) (0) | 2021.12.30 |
[백준][DFS/BFS] 21736. 헌내기는 친구가 필요해 (파이썬/Python) (0) | 2021.12.28 |
[백준][Floyd-Warshall/BFS]2660.회장 뽑기 (파이썬/Python) (0) | 2021.12.27 |
[백준][그리디 알고리즘] 20044. Project Teams(파이썬/Python) (0) | 2021.12.27 |