HwangHub

[다익스트라] 백준 1753. 최단경로 본문

workspace/알고리즘

[다익스트라] 백준 1753. 최단경로

HwangJerry 2023. 5. 20. 23:43
 

1753번: 최단경로

첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1 ≤ K ≤ V)가

www.acmicpc.net

 

문제 해석

위 문제는 전형적인 다익스트라 문제이다. 시작점을 지정하고, 유향 그래프에서 최단 경로를 찾는 문제이니, 다익스트라 정의를 공부하는 문제라고 봐도 무방하다.

 

풀이 코드

import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**5)
import heapq

# 노드 개수 n, 엣지 갯수 m
n, m = map(int,input().split())

# 시작 노드 번호
start = int(input())

# 무한 INF, infinite
INF = int(1e9)

# 그래프 초기화
graph = [[] * (n+1) for _ in range(n+1)]
# 최단 거리 테이블 모두 무한으로 초기화
distance = [INF] * (n+1)

# 엣지를 그래프에 입력
for _ in range(m):
    a, b, c = map(int, input().split()) # a -> b, c는 cost
    graph[a].append((b, c)) # 다익스트라는 유향 그래프

def dijkstra(start):
    q = []
    # 시작 노드로 가기 위한 최단 경로는 0으로 설정하여 큐에 삽입
    heapq.heappush(q, (0, start))
    distance[start] = 0

    while q:
        # 최단 거리가 짧은 노드에 대한 정보 꺼내기 (by 최소 힙)
        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]))

dijkstra(start)

for i in range(1, n+1):
    if distance[i] == INF:
        print("INF")
    else:
        print(distance[i])

'workspace > 알고리즘' 카테고리의 다른 글

자바로 풀 수 없는 문제  (0) 2023.05.30
[다익스트라] 백준 1446. 지름길  (0) 2023.05.20
[DFS/BFS] 백준 11724. 연결 요소의 개수  (0) 2023.05.17
[DFS] 백준 13023. ABCDE  (0) 2023.05.17
[BFS] 2644 촌수 계산  (1) 2023.05.12
Comments