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 사용 권장