코딩 테스트/백준
[백준 2024/02/26] 1753번 최단경로
미뿌감
2024. 2. 26. 22:24
728x90
https://www.acmicpc.net/problem/1753
1753번: 최단경로
첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1 ≤ K ≤ V)가
www.acmicpc.net
1. 접근 방법
전형적인 dijkstra 문제였다.
코드에 주석을 달아서 더 설명해 보도록 하겠다.
2. 코드
import heapq
INF = int(1e9)
def findCheapestPrice(n, src, nodes): # edge들을 저장한 nodes를 넘겨 받았다.
dist = [INF] * (n + 1) # dist라는 list에 각각의 노드에 들어가는 최솟값을 INF로 저장하였다.
graph = [[] for _ in range(n + 1)]# nodes를 dijkstra 입맛에 맞게 편집하기 위해 graph 선언.
q = []
for a, b, c in nodes:
graph[a].append((b, c)) # a : 시작 노드, b: 도착 노드, c: weight
heapq.heappush(q, (0, src)) # 시작 노드인 src에 대해서 weight 를 0 으로 두어 가장 먼저 pop이 되도록 하였다.
dist[src] = 0 #시작 노드이므로, 값을 0으로 저장.
while q:
acc, cur = heapq.heappop(q) # 최소 acc를 가지는 것을 pop
if dist[cur] < acc: # 여태까지 저장한 값보다 현재 dist[cur] 에 저장된 값이 적다면 continue
continue
for adj, d in graph[cur]: # 해당 노드로부터 인접 노드들을 하나씩 꺼내온다.
cost = acc + d # 저장된 것 + 새로 이동하면서 얻게 될 값
if cost < dist[adj]: # cost가 더 작다면, 새로운 값으로 대치해준다.
dist[adj] = cost
heapq.heappush(q, (cost, adj)) #heapque에다가 바꾼 값을 다시 넣어준다. 현재까지의 경로를 넣어주는 느낌
return dist
def input_nodes(n, e):
nodes = []
for _ in range(e):
nodes.append(list(map(int, input().split())))
return nodes
def print_nodes(dist, n):
for i in range(1, n + 1):
if dist[i] == INF:
print("INF")
else:
print(dist[i])
def main():
n, e = map(int, input().split())
start = int(input())
dist = findCheapestPrice(n, start, input_nodes(n, e))
print_nodes(dist, n)
if __name__ == "__main__":
main()
728x90