Algorithm/GraphTheory

[백준 1753번] 최단경로 - 다익스트라(Dijkstra Algorithm)

킹우현 2023. 10. 7. 20:59

 

1753번: 최단경로

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

www.acmicpc.net

import sys
import heapq

input = sys.stdin.readline

v, e = map(int,input().split())

INF = float("inf")

graph = [[] for _ in range(v+1)]
distance = [INF]*(v+1)

start_node = int(input())

for _ in range(e):
    start, end, cost = map(int,input().split())
    graph[start].append((end,cost))

def dijkstra(start):
    
    distance[start] = 0
    
    q = []

    heapq.heappush(q,(0,start))
    
    while q:
        dist, current = heapq.heappop(q)
        
        if distance[current] < dist:
            continue
        
        for node, cost in graph[current]:
            new_cost = dist + cost

            if new_cost < distance[node]:
                distance[node] = new_cost
                heapq.heappush(q,(new_cost,node))

dijkstra(start_node)

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

이 문제 또한 다익스트라 알고리즘을 사용하여 '특정 지점에서 특정 지점으로 도착하는 최단 경로 및 최단 거리를 구하는 문제'이다.

 

heapq를 활용하여 보다 적은 시간복잡도로 그래프의 최단 경로 및 거리를 구할 수 있었던 문제였다 :)