문제
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째 줄에는 우리가 구하고자 하는 구간 출발점의 도시번호와 도착점의 도시번호가 주어진다. 출발점에서 도착점을 갈 수 있는 경우만 입력으로 주어진다.
출력
첫째 줄에 출발 도시에서 도착 도시까지 가는데 드는 최소 비용을 출력한다.
문제 풀이
최소 비용 구하기 문제는 하나의 도시에서 다른 도시로 가는 데 드는 최소 비용을 구하는 문제이므로
Dijkstra 알고리즘을 이용하면 해결할 수 있습니다.
Dijkstra 알고리즘은 우선순위 큐 (Heap)를 활용하는 알고리즘입니다.
파이썬에서는 heapq 라이브러리를 제공하는데, 최소힙 (Min Heap) 형태로 제공해줍니다.
정확한 Dijkstra 알고리즘은 코드에서 Dijkstra 함수를 확인해주세요!
My Code
import heapq
import sys
input = sys.stdin.readline
INF = int(1e9)
n = int(input()) # 도시의 수
m = int(input()) # 버스의 수
graph = [[] for _ in range(n + 1)]
for _ in range(m):
a, b, cost = map(int,input().split()) # 출발도시, 도착도시, 비용
graph[a].append((b, cost)) # a에서 b까지 가는 비용이 cost라는 뜻
distance = [INF] * (n + 1) # 최소 비용을 저장할 list
start, end = map(int,input().split()) # 출발할 도시, 도착할 도시
# dijkstra Algorithm
def dijkstra(start):
q = []
heapq.heappush(q, (0, start)) # 비용과 노드를 heap에 저장
distance[start] = 0 # 출발 도시의 비용은 0
while q: # 큐가 빌 때까지 반복
dist, now = heapq.heappop(q)
if distance[now] < dist: # 이미 최소비용이라면 continue
continue
for i in graph[now]:
cost = dist + i[1]
if cost < distance[i[0]]: # 계산한 비용이 더 작다면 갱신
distance[i[0]] = cost
heapq.heappush(q, (cost, i[0])) # heap에 삽입
dijkstra(start)
print(distance[end])
'백준(Python) 풀이' 카테고리의 다른 글
백준 11403번. 경로 찾기 (Python / 파이썬) (0) | 2022.04.06 |
---|---|
백준 1238번. 파티 (Python / 파이썬) (0) | 2022.04.06 |
백준 1920번. 수 찾기 (Python / 파이썬) (0) | 2022.04.06 |
백준 11399번. ATM (Python / 파이썬) (0) | 2022.04.06 |
백준 1110번. 더하기 사이클 (Python / 파이썬) (0) | 2022.04.06 |
댓글