본문 바로가기

Algorithm/BOJ

[BOJ] 1916. 최소비용 구하기 성공

https://www.acmicpc.net/problem/1916

 

1916번: 최소비용 구하기

첫째 줄에 도시의 개수 N(1 ≤ N ≤ 1,000)이 주어지고 둘째 줄에는 버스의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 M+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그

www.acmicpc.net

 

 

1. 해결방법

"""
1. 아이디어
- 한 점에서 다른 점 까지의 최소 비용 : 다익스트라
- 간선, 인접리스트 저장
- 거리 배열을 무한대로 저장
- heap이 빌때까지 다음을 반복
    - 힙의 최솟값을 꺼내고 최신값인지 확인
    - 간선을 타고 간 비용이 dist[]보다 작으면 갱신
    - 해당 노드를 다시 heap에 push

2. 시간복잡도
- O(ElogV)

3. 자료구조
- heap : [비용, 노드 번호]
- 거리 배열 : []
- 인접리스트 : [비용, 노드 번호]
"""

 

 

2. 정답코드

import sys
import heapq
input = sys.stdin.readline
INF = sys.maxsize

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

edge = [[] for _ in range(N + 1)]
for i in range(M):
    a, b, c = map(int, input().split())
    edge[a].append([c, b])

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

heap = [[0, start]]
dist = [INF] * (N + 1)
dist[start] = 0

while heap:
    ew, ev = heapq.heappop(heap)
    if dist[ev] != ew: continue
    for nw, nv in edge[ev]:
        if dist[nv] > ew + nw:
            dist[nv] = ew + nw
            heapq.heappush(heap, [dist[nv], nv])

print(dist[end])
다익스트라 기본 알고리즘을 이용하면 문제 없이 풀 수 있다.
어찌됐든 다익스트라가 어떤 로직인지 그 로직을 코드로 어떻게 풀었는지는 무조건 알아야한다.

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] 4485. 녹색 옷 입은 애가 젤다지?  (0) 2022.09.09
[BOJ] 1504. 특정한 최단 경로  (0) 2022.09.09
[BOJ] 1753. 최단경로  (0) 2022.09.09
[BOJ] 16398. 행성 연결  (0) 2022.09.08
[BOJ] 4386. 별자리 만들기  (0) 2022.09.07