N
: 도시 개수
M
: 버스 개수
도시 개수, 버스 개수를 입력 받고 출발 도시 번호, 도착 도시 번호, 버스 비용
을 순서대로 입력 받는다.
알고 싶은 출발 도시, 도착 도시를 입력 받아 이동하는데 드는 최소 비용을 구하는 문제이다.
출발 도시 번호, 도착 도시 번호, 버스 비용
를 입력받기 때문에 버스 정보로 저장할 그래프는 가중치가 있는 단방향 그래프라고 할 수 있다.
다익스트라 알고리즘을 힙 자료구조를 사용한 우선순위 큐로 구현한다면 효율적으로 출발 노드에서 다른 모든 노드까지의 최단 거리를 구할 수 있다.
알고리즘의 결과로 얻은 최단 거리 중 도착 도시까지의 최단 거리를 출력하면 원하는 결과를 얻을 수 있을 것이다.
⭐️ 다익스트라 알고리즘 구현하기
1️⃣ 시작 도시의 최단 거리를 0으로 하고 큐에 삽입
2️⃣ 큐가 빌 때까지 거리가 가장 짧은 도시 선택
3️⃣ 해당 도시에서 갈 수 있는 모든 도시의 거리 계산
4️⃣ 최단 거리로 갱신하고 해당 도시를 큐에 삽입해 위의 과정 반복
버스 정보 입력 →
각 도시 힙 연산 →
연결 도시 힙 연산 →
최종 시간복잡도
으로 최악의 경우 이 된다.
이는 0.5초내 연산 가능하다.
다익스트라 알고리즘 이용
최소 비용 = 최단 거리
로 치환해서 코드를 작성하다가 똑같은 의미인데 변수명이 distance
, weight
로 달라지면서 비용 갱신하는 부분을 잘못 구현했다.import sys
import heapq
input = sys.stdin.readline
# 무한 의미
INF = int(1e9)
# N 입력
N = int(input())
# M 입력
M = int(input())
# 버스 정보 저장할 그래프 정의
graph = [[] for _ in range(N + 1)]
# 최단 거리 저장할 리스트 정의
distances = [INF] * (N + 1)
# M개의 버스 정보 입력
for _ in range(M):
start, end, weight = map(int, input().split())
# 단방향 그래프
graph[start].append((end, weight))
# 다익스트라 구현하기
def dijkstra(start):
queue = []
# 시작 도시 최단 거리 0
heapq.heappush(queue, (0, start))
distances[start] = 0
# 큐 빌 때까지 반복
while queue:
# 값이 가장 작은 도시 선택
distance, city = heapq.heappop(queue)
# 방문한 적 있는 도시면 무시
if distances[city] < distance:
continue
# 연결 도시 확인
for next_city, weight in graph[city]:
new_distance = distance + weight
# 더 짧은 거리 있으면 갱신
if new_distance < distances[next_city]:
distances[next_city] = new_distance
heapq.heappush(queue, (new_distance, next_city))
# A, B 입력
A, B = map(int, input().split())
# 다익스트라 수행
dijkstra(A)
# B 최단 거리 출력
print(distances[B])
V
, 에지 수 : E
🐍 다익스트라 알고리즘의 5가지 단계
(노드, 가중치)
0
인 출발 노드에서 시작Min(선택 노드의 최단 거리 리스트 값 + 에지 가중치, 연결 노드 최단 거리 리스트 값)
🐍 다익스트라 알고리즘 구현하는 2가지 방법
V
: 노드의 개수heapq
사용 권장