[백준] 1916번.최소비용 구하기 | 골드5 | Python

싱숭생숭어·2024년 4월 16일
0

백준

목록 보기
31/32

문제

시간 제한메모리 제한제출정답맞힌 사람정답 비율
0.5 초128 MB93707305712021232.488%

문제 설명

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째 줄에는 우리가 구하고자 하는 구간 출발점의 도시번호와 도착점의 도시번호가 주어진다. 출발점에서 도착점을 갈 수 있는 경우만 입력으로 주어진다.

출력

첫째 줄에 출발 도시에서 도착 도시까지 가는데 드는 최소 비용을 출력한다.

예제 입력 1

5
8
1 2 2
1 3 3
1 4 1
1 5 10
2 4 2
3 4 1
3 5 1
4 5 3
1 5

예제 출력 1

4

내 풀이

문제 아이디어

  • 그래프의 구조자체는 이전에 풀이한 18352번.특정 거리의 도시 찾기와 같지만, 차이점이 있다.

    • 특정 거리의 도시 찾기: 모든 간선의 비용이 1
    • 최소 비용 구하기: 모든 간선의 비용이 각기 다름
  • 따라서 이 문제는 단순 dp+bfs가 아닌 다익스트라 알고리즘(python의 heapq)을 사용해야 시간초과 없이 문제를 풀 수 있다.

  • 다익스트라(최단 거리)문제는 처음이어서, 이전에 정리했던 이코테의 최단거리 알고리즘 내용을 참고했다.

최종 코드

# 다익스트라(최단경로 알고리즘) 활용
# 출발: start 노드, 원하는 출력 값: end 노드의 최단거리
# heapq를 사용해 구현한 다익스트라 알고리즘
import heapq
import sys
input = sys.stdin.readline

INF = int(1e9)
n = int(input()) # 도시의 개수
m = int(input()) # 버스의 개수
graph = [[] for i in range(n+1)]
for _ in range(m):
    a, b, c = map(int, input().split()) # a: 출발도시 b: 도착도시 c:버스 비용
    graph[a].append((b,c)) # a번 노드에서 b번 노드로 가는 비용이 c 
start, end = map(int, input().split()) # 구하려는 도시의 루트 
distance = [INF] * (n+1) # 각 노드별 최단거리 테이블 초기화

def dijkstra(start):
    q = []
    heapq.heappush(q,(0,start)) # q라는 최소힙에 (0,start) 삽입
    distance[start] = 0 # start 지점의 최소거리 0으로 지정
    while q:
        dist, now = heapq.heappop(q) # 최단거리가 가장 짧은 노드 꺼내기
        if distance[now] < dist: # 최단거리 테이블에 저장된 값이 더 최단거리인 경우
            continue # 아무것도 안하기(이미 방문한 노드라는 뜻)
        for i, j in graph[now]: # 현재 노드와 인접한 노드에 대해 반복
            cost = dist + j # 현재 노드를 거쳐가는 경우의 비용
            if cost < distance[i]: # 현재 노드를 거쳐가는 거리가 더 짧은 경우
                distance[i] = cost # 최단거리 테이블 업데이트
                heapq.heappush(q,(cost, i)) # 현재 노드를 거쳐가는 경로 최소힙에 삽입
dijkstra(start)
print(distance[end])

  • readline으로 입력값을 받아주지 않으면 시간초과가 발생한다.

  • 시간제한이 0.5초인 무지막지한 문제이기 때문에 무조건 최소값에 대하여 O(logn)의 시간복잡도를 갖는 heappop을 활용해야 할 것이다.

profile
공부합시당

0개의 댓글