[BOJ] 1753 최단경로
다익스트라, 해시, 우선순위 큐
해당 문제는 최단 경로를 구하는 문제이다. 문제에서 대놓고 주어진 시작점에서 다른 모든 정점으로의 최단 경로를 구해야 하고, 음수 간선이 없기 때문에 다익스트라 알고리즘을 사용할 수 있다.
주어진 입력의 개수가 10000개가 넘어가므로, O(V^2)의 알고리즘을 사용한다면 시간 초과가 발생한다. 따라서 가장 비용이 작은 노드를 선택하는 과정에서 우선순위 큐 자료구조를 사용하여 시간 복잡도를 개선한다.
그리고 문제에서 함정이 있는데, 서로 다른 두 정점 사이에 여러 개의 간선이 존재할 수 있기 때문에, 해시(dict)자료구조를 사용하여 인접 리스트를 초기화 한다.
코드는 다음과 같다.
import sys
import heapq
INF = int(1e9)
def dijkstra(start):
q = []
heapq.heappush(q, (0, start))
distance[start] = 0
while q:
dist, now = heapq.heappop(q)
if distance[now] < dist:
continue
# items 쓸껄..
for adj in adj_lst[now].keys():
cost = dist + adj_lst[now][adj]
if cost < distance[adj]:
distance[adj] = cost
heapq.heappush(q, (cost, adj))
def solution(vtx, k):
dijkstra(k)
for i in range(1, vtx + 1):
if distance[i] == INF:
print("INF")
else:
print(distance[i])
if __name__ == "__main__":
V, E = map(int, sys.stdin.readline().rstrip().split())
K = int(sys.stdin.readline().rstrip())
adj_lst = [{} for _ in range(V + 1)]
distance = [INF] * (V + 1)
for _ in range(E):
u, v, Cost = map(int, sys.stdin.readline().rstrip().split())
try:
adj_lst[u][v] = min(adj_lst[u][v], Cost)
except:
adj_lst[u][v] = Cost
solution(V, K)