문제
풀이
- 주어진 시작점에서 다른 모든 정점으로의 최단 경로를 구하는 문제로
최단 경로 알고리즘
문제이다.
- 정점과 간선의 범위가 크므로
플로이드 워셜
알고리즘 보다는 다익스트라 알고리즘
이 더 적합하며 힙, 우선순위 큐
를 사용하여 구현하면 효율적으로 접근할 수 있다.
코드
import heapq
import sys
input = sys.stdin.readline
inf = int(1e9)
def dijkstra(k: int):
queue = []
heapq.heappush(queue, (0, k))
distance[k] = 0
while queue:
dist, now = heapq.heappop(queue)
if distance[now] < dist:
continue
for i in graph[now]:
cost = dist + i[1]
if cost < distance[i[0]]:
distance[i[0]] = cost
heapq.heappush(queue, (cost, i[0]))
if __name__ == '__main__':
v, e = map(int, input().split())
k = int(input())
graph = [[] for _ in range(v + 1)]
distance = [inf] * (v + 1)
for _ in range(e):
x, y, z = map(int, input().split())
graph[x].append((y, z))
dijkstra(k)
for x in range(1, v+1):
if distance[x] == inf:
print('INF')
else:
print(distance[x])
결과
출처 & 깃허브
BOJ 1753
GITHUB