방향그래프가 주어지면 주어진 시작점에서 다른 모든 정점으로의 최단 경로를 구하는 프로그램을 작성하시오. 단, 모든 간선의 가중치는 10 이하의 자연수이다.
https://www.acmicpc.net/problem/1753
1753번: 최단경로
첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1 ≤ K ≤ V)가
www.acmicpc.net
import sys
import heapq
V,E=map(int,sys.stdin.readline().split())
K=int(sys.stdin.readline())
answer=[float('inf') for _ in range(V+1)]
graph=[[]for _ in range(V+1)]
queue=[]
answer[K]=0
for _ in range(E):
u,v,w=map(int,sys.stdin.readline().split())
graph[u].append([v,w])
heapq.heappush(queue,[0,K])
while queue:
current_cost,current_point=heapq.heappop(queue)
for x in graph[current_point]:
cost=current_cost+x[1]
if(cost>=answer[x[0]]):
continue
else:
answer[x[0]]=cost
heapq.heappush(queue,[cost,x[0]])
for x in range(1,V+1):
if(answer[x]==float('inf')):
print("INF")
else:
print(answer[x])
※ 최단 경로
● 현재 지점까지 오는 최소 거리와 현재 지점에서부터 가장 가까운 지점까지의 거리의 합을 cost 라는 변수에 저장한다. 이 cost 값이 현재 지점에서부터 가장 가까운 지점에 저장되어 있는 최소 거리보다 크거나 같으면 굳이 갱신해 줄 필요가 없으므로 넘어간다. 만약 cost 값이 더 작으면 현재 지점에서부터 가장 가까운 지점에 저장되어 있는 최소 거리를 cost로 갱신해 준 후, cost 와 이 지점 번호를 최소 힙에 저장한다. 매 단계마다 최소 힙에서 그때 저장했던 cost 값이 작은 순서대로 불러내게 된다.
● 모든 단계가 끝나고 각 지점까지의 최소 거리를 출력해주면 답을 구할 수 있다.
♣ 다익스트라 알고리즘
다익스트라 알고리즘 - 나무위키
다익스트라 알고리즘은 다음과 같다. (P[A][B]는 A와 B 사이의 거리라고 가정한다) 출발점으로부터의 최단거리를 저장할 배열 d[v]를 만들고, 출발 노드에는 0을, 출발점을 제외한 다른 노드들에는
namu.wiki
'백준(baekjoon) > 골드' 카테고리의 다른 글
백준(baekjoon) 16928번: 뱀과 사다리 게임(골드 5, 파이썬 PYTHON) - 최단 경로 (0) | 2023.02.03 |
---|---|
백준(baekjoon) 1753번: 최단 경로(골드 5, 파이썬 PYTHON) - 최단 경로 (0) | 2023.02.01 |
백준(baekjoon) 2293번: 동전 1(골드 5, 파이썬 PYTHON) - 동적 계획법 2 (0) | 2023.01.30 |
백준(baekjoon) 7576번: 토마토(골드 5, 파이썬 PYTHON) - 그래프와 순회 (0) | 2023.01.28 |
백준(baekjoon) 2110번: 공유기 설치(골드 4, 파이썬 PYTHON) - 이분 탐색 (0) | 2023.01.21 |