728x90
반응형
문제 설명
방향그래프가 주어지면 주어진 시작점에서 다른 모든 정점으로의 최단 경로를 구하는 프로그램을 작성하시오. 단, 모든 간선의 가중치는 10 이하의 자연수이다.
제한 사항
-첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1≤V≤20,000, 1≤E≤300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1≤K≤V)가 주어진다. 셋째 줄부터 E개의 줄에 걸쳐 각 간선을 나타내는 세 개의 정수 (u, v, w)가 순서대로 주어진다. 이는 u에서 v로 가는 가중치 w인 간선이 존재한다는 뜻이다. u와 v는 서로 다르며 w는 10 이하의 자연수이다. 서로 다른 두 정점 사이에 여러 개의 간선이 존재할 수도 있음에 유의한다.
-첫째 줄부터 V개의 줄에 걸쳐, i번째 줄에 i번 정점으로의 최단 경로의 경로값을 출력한다. 시작점 자신은 0으로 출력하고, 경로가 존재하지 않는 경우에는 INF를 출력하면 된다.
입출력 예
input |
output |
5 6 1 5 1 1 1 2 2 1 3 3 2 3 4 2 4 5 3 4 6 |
0 2 3 7 INF |
접근법
엄청 간단합니다! 다익스트라 알고리즘을 사용하면 금방 풀리는 문제입니다.
다익스트라 알고리즘 설명은 [여기] 를 클릭해주세요
나의 코드
import sys
import heapq
V, E = map(int, sys.stdin.readline().split())
root = int(sys.stdin.readline())
graph = [[] for _ in range(V+1)]
INF = sys.maxsize
heap = []
distance = [INF] * (V+1)
for _ in range(E):
start, end, value = map(int, sys.stdin.readline().split())
graph[start].append([end,value])
def dijkstra(root):
distance[root] = 0
heapq.heappush(heap, (0,root))
while heap:
current_dis, current_node = heapq.heappop(heap)
if distance[current_node] < current_dis: continue
for next_node, dis in graph[current_node]:
next_dis = dis + current_dis
if distance[next_node] > next_dis:
distance[next_node] = next_dis
heapq.heappush(heap,(next_dis,next_node))
dijkstra(root)
for value in distance[1:]:
print(value if value != INF else "INF")
반응형
'알고리즘 > 백준알고리즘' 카테고리의 다른 글
[백준] 11047번 동전 0 (0) | 2021.04.27 |
---|---|
[백준] 11657번 타임머신 (0) | 2021.04.03 |
[백준] 1655번 가운데를 말해요 (0) | 2021.03.31 |
[백준] 5397번 키로거 (0) | 2021.03.26 |
[백준] 1991번 트리 순회 (0) | 2021.03.24 |