Algorithm/백준

[백준/Python] 최단경로

poppy 2021. 11. 19. 17:09
반응형

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

from collections import defaultdict
import sys, heapq
input = sys.stdin.readline

V, E = map(int, input().split()) # 정점, 간선 개수
start = int(input()) # 시작 노드
graph = defaultdict(list) # 방향 그래프
dist = [sys.maxsize for _ in range(V+1)] # 최단 거리 리스트

# 간선 정보 입력받기
for _ in range(E):
    u, v, w = map(int, input().split())
    graph[u].append((v, w))

# 다익스트라 메서드
def dijkstra(start):
    queue = [] # 우선순위 큐
    dist[start] = 0 # 시작 노드 거리는 0
    heapq.heappush(queue, (0, start)) # 꼭 (거리, 노드)로 삽입해야 함

    while queue:
        cur_dist, node = heapq.heappop(queue) # 현재 노드의 거리, 현재 노드 
        if cur_dist > dist[node]: # 현재 노드의 거리가 최단거리 리스트의 값보다 크면 넘어감
            continue
        for adj_node, adj_dist in graph[node]: # 그렇지 않다면 현재 노드와 연결된 노드 가져와서
            cost = cur_dist + adj_dist # 거리 계산
            if cost < dist[adj_node]: # 계산한 거리가 최단거리 리스트의 값보다 작다면
                dist[adj_node] = cost # 거리 수정
                heapq.heappush(queue, (cost, adj_node)) # 큐에 삽입

dijkstra(start) # 다익스트라 수행
# 결과 출력
for i in range(1, V+1):
    if dist[i] == sys.maxsize: # 경로가 없는 경우
        print('INF')
    else: # 경로가 있다면 최단 거리 출력
        print(dist[i])

1. 필요한 정보를 입력받고 필요한 변수를 생성한다.

2. 다익스트라를 수행한다.

     2-1. 우선순위 큐를 생성하고 시작노드의 거리는 0으로 만든다. 큐에 시작 노드를 삽입하는데 꼭 (거리, 노드) 순으로 넣어야 한다.

     2-2. 큐에 값이 없을 때까지 다음을 반복한다.

     2-3. 큐에서 현재 노드를 가져온다. 현재 노드의 거리가 최단거리 리스트의 값보다 크면 비교할 것도 없으므로 넘어간다.

     2-4. 그렇지 않다면 현재 노드와 연결된 노드를 가져온다. 연결된 노드의 최단 거리를 계산하고 그 거리가 최단거리 리스트의 값보다 작다면 거리를 수정한 후 큐에 삽입한다.

3. 결과를 출력한다.

     3-1. 경로가 없는 경우 INF를 출력하고 그렇지 않다면 최단 거리를 출력한다.

반응형

'Algorithm > 백준' 카테고리의 다른 글

[백준/Python] 녹색 옷 입은 애가 젤다지?  (0) 2021.11.24
[백준/Python] 스타트링크  (0) 2021.11.21
[백준/Python] 토마토  (0) 2021.11.18
[백준/Python] 단지번호붙이기  (0) 2021.11.15
[백준/Python] 탑  (0) 2021.11.13