728x90
백준 1753 최단 경로 구하기
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
Step 1 문제 분석하기
문제
모든 간선의 가중치가 10 이하의 자연수.
자연수는 양수이므로 모든 간선이 양수 -> 백준 1753은 전형적인 다익스트라 알고리즘 문제이다.
- 다익스트라 알고리즘 수행 과정
- 거리 리스트에서 아직 방문하지 않은 노드 중 현재 값이 가장 작은 노드를 선택한다. 즉, 우선순위 큐에서 데이터를 뽑아온다.
- 해당 노드와 연결된 노드들의 최단 거릿값을 다음 공식을 이용해 업데이트한다.
- [연결 노드 거리 리스트 값]보다 [선택 노드의 거리 리스트 값 + 에지 가중치] 가 더 작은 경우 업데이트 수행
- 업데이트가 수행되는 경우 연결 노드를 우선순위 큐에 삽입
3. 큐가 빌 때까지 1~2를 반복한다.
Step 2 수도코드
V(노드 개수), E(에지 개수)
K (출발 노드)
distance(거리 저장 리스트)
visited (방문 여부 저장 리스트)
myList(에지 데이터 저장 인접 리스트)
q(다익스트라를 위한 우선순위 큐)
for 에지 개수만큼 반복:
인접 리스트에 에지 정보 저장
# 다익스트라 수행
출발 노드는 우선순위 큐에 넣고 시작 # 자동으로 거리가 최소인 노드를 선택
거리 리스트에 출발 노드의 값을 0으로 설정
while 큐가 빌 때까지:
우선순위 큐에서 노드 가져오기
현재 선택된 노드를 방문한 적이 있는지 확인
현재 노드를 방문 노드로 업데이트
for 현재 선택 노드의 에지 개수:
if 연결 노드 방문 전 and 현재 선택 노드 최단 거리 + 비용 < 연결 노드의 최단 거리:
연결 노드 최단 거리 업데이트
우선순위 큐에 연결 노드 추가
완성된 거리 리스트를 탐색해 출력
Step 3 코드 작성
import sys
input = sys.stdin.readline
from queue import PriorityQueue
V,E = map(int, input().split())
K = int(input())
# 거리 저장 리스트 (충분히 큰 값으로 초기화)
distance = [sys.maxsize]*(V+1)
#방문 여부 저장 리스트
visited = [False] * (V+1)
myList = [ [] for _ in range(V+1)]
q = PriorityQueue()
for _ in range(E):
u,v,w = map(int,input().split())
myList[u].append((v,w))
q.put((0,K))
distance[K] = 0
while q.qsize() > 0:
current = q.get()
c_v = current[1]
if visited[c_v]:
continue
visited[c_v] = True
for tmp in myList[c_v]:
next = tmp[0]
value = tmp[1]
if distance[next] > distance[c_v] + value:
distance[next] = distance[c_v] + value
q.put((distance[next], next))
for i in range(1,V+1):
if visited[i]:
print(distance[i])
else:
print("INF")
- 참고자료
학습 페이지
www.inflearn.com
728x90
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ] 백준 11404 플로이드 (python 파이썬) (0) | 2023.04.18 |
---|---|
[BOJ] 백준 11657 타임머신 (파이썬 python) (0) | 2023.04.15 |
[BOJ] 백준 11399 ATM (파이썬 python) (0) | 2023.03.23 |