알고리즘

[알고리즘|파이썬] 백준 1916 최소비용 구하기

따오잉 2025. 2. 17. 23:17

문제 링크: https://www.acmicpc.net/problem/1916

 

📌 문제 탐색하기

시간 제한: 0.5 초
메모리 제한: 128 MB

 

✏️ 구해야 하는 정답

N개의 노드, M개의 엣지가 주어지고, 각 엣지에는 가격이 매겨진다. 시작, 종료 노드가 주어졌을때 최소 비용을 구하시오.

 

조건

- 1 ≤ N ≤ 1,000

- 1 ≤ M ≤ 100,000

- 버스 비용은 0보다 크거나 같고, 100,000보다 작은 정수

 


📌 풀이하기 

예시 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️⃣ 그래프를 인접 리스트 형태로 표현

주어진 M개의 버스 정보를 기반으로 단방향 그래프를 구성한다.

인접 리스트(Adjacency List)를 사용하여 그래프를 저장한다.

graph[A] 리스트에 (B, 비용) 형태로 저장하여 출발 도시 A에서 도착 도시 B까지 가는 비용을 나타낸다.

 

2️⃣ 다익스트라 알고리즘 적용

다익스트라 알고리즘을 사용하여 출발 도시에서 각 도시까지의 최소 비용을 구한다.

우선순위 큐(힙, heapq)를 활용하여 가장 적은 비용의 노드를 우선 탐색한다.

거리 정보(distance[])를 유지하며 더 작은 비용이 발견되면 갱신한다.

최종적으로 distance[end] 값을 출력하면 최소 비용을 구할 수 있다.

 


📌 코드 설계하기

1. N개의 도시와 M개의 버스 정보를 입력받는다.

2. 인접 리스트(graph[])를 만들어 (도착지, 비용) 형태로 저장한다.

 

다익스트라 함수 실행 

1. 최단 거리 테이블 (distance[])을 무한대(INF)로 초기화한다.

2. 우선순위 큐를 사용하여 비용이 작은 노드부터 탐색한다.

3. 현재 노드에서 갈 수 있는 모든 인접 노드를 확인하며 더 작은 비용으로 이동할 수 있으면 갱신한다.

4. 모든 노드를 탐색한 후, distance[end] 값을 출력한다.


📌 정답 코드

import sys
import heapq

input = sys.stdin.readline

n = int(input().strip())
m = int(input().strip())

graph = [[] for _ in range(n + 1)]
for _ in range(m):
    a, b, p = map(int, input().split())
    graph[a].append((b, p))

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

def dijkstra(start):
    INF = float('inf')
    distance = [INF] * (n + 1)
    distance[start] = 0
    pq = [(0, start)]
    
    while pq:
        cost, node = heapq.heappop(pq)
        
        if distance[node] < cost:
            continue
        
        for next_node, price in graph[node]:
            new_cost = cost + price
            if new_cost < distance[next_node]:
                distance[next_node] = new_cost
                heapq.heappush(pq, (new_cost, next_node))
    
    return distance

min_cost = dijkstra(start)[end]
print(min_cost)