BOJ 1916 최소비용 구하기

·2022년 9월 22일
0
post-custom-banner

너무 그래프만 푸는 것 같아 오늘은 다익스트라 문제입니다. 모두 취업까지 화이팅입니다.

문제

N개의 도시가 있다. 그리고 한 도시에서 출발하여 다른 도시에 도착하는 M개의 버스가 있다. 우리는 A번째 도시에서 B번째 도시까지 가는데 드는 버스 비용을 최소화 시키려고 한다. A번째 도시에서 B번째 도시까지 가는데 드는 최소비용을 출력하여라. 도시의 번호는 1부터 N까지이다.

입력

첫째 줄에 도시의 개수 N(1 ≤ N ≤ 1,000)이 주어지고 둘째 줄에는 버스의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 M+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가 주어진다. 그리고 그 다음에는 도착지의 도시 번호가 주어지고 또 그 버스 비용이 주어진다. 버스 비용은 0보다 크거나 같고, 100,000보다 작은 정수이다.

그리고 M+3째 줄에는 우리가 구하고자 하는 구간 출발점의 도시번호와 도착점의 도시번호가 주어진다. 출발점에서 도착점을 갈 수 있는 경우만 입력으로 주어진다.

풀이방법

기본적인 다익스트라 문제입니다. 기본적인건데도 불구하고 골드5라서 놀랐네요. 개인적으로는 다익스트라 알고리즘 로직이 좀 헷갈리는 부분도 있고, heap을 사용하지 않고 정석으로 푸면 시간초과가 나는 부분 때문이 아닌가합니다.
다익스트라 풀이법은 정석으로 구현하는 풀이법과 heap으로 구현하는 두가지 방법이 있는데 웬만하면 heap 풀이법으로 해결하시는 걸 추천드립니다.

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

N = int(input())
M = int(input())

dic = defaultdict(list)

for _ in range(M):
    start,depart,cost = map(int,input().split())
    dic[start].append((cost,depart))


start,depart = map(int,input().split()) 

def dijkstra(x):

    h = []
    heappush(h,[0,x])
    visited = [float('inf')]*(N+1)

    visited[x] = 0

    while h :
        
        curr_cost,curr_node = heappop(h)
        if curr_cost > visited[curr_node]:
            continue
        for next_cost,next_node in dic[curr_node]:
            sum_cost = next_cost + curr_cost

            if sum_cost<visited[next_node]:
                visited[next_node] =  sum_cost
                heappush(h,[sum_cost,next_node])

    return visited
answer = dijkstra(start)
print(answer[depart])
profile
일단 답만 맞춰보겠습니다.
post-custom-banner

0개의 댓글