알고리즘/알고리즘문제

[알고리즘] 백준 1753 최단경로

Unipiz 2022. 7. 8. 09:26

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

 

풀이과정.

최단경로를 구하는 문제로 Queue에 간선을 넣어 순서대로 꺼내며 dp배열에 최단 경로를 갱신해나가면 된다고 생각했다.

허나 무수한 '시간초과' 로 상당히 애먹었던 문제.

그 이유는 '서로 다른 두 정점 사이에 여러 개의 간선이 존재할 수도 있음에 유의한다.'

'유의'란 언급이 있다면 진짜 유의해야한다.

처음에 heapq를 사용하지도 않았다.  우선순위큐를 사용하여 가중치의 최소값우선으로 비교하면 시간이 절약가능했다.

 

>> 유의에 유의 할 것.

>>자료구조 Queue, DP, 우선순위큐

    -> heapq 사용법 복습하기

import sys
import heapq
V,E=map(int,input().split())
K=int(input())
arr=[[] for _ in range(V+1)]
for _ in range(E):
	a,b,c=map(int,sys.stdin.readline().split())
	arr[a].append([b,c])
q=[]
dp=['INF']*(V+1)
dp[K]=0
heapq.heappush(q,[0,K])
while q:
	a,b=heapq.heappop(q)
	if dp[b]!='INF' and dp[b]<a:
		continue
	for t1,t2 in arr[b]:
		if dp[t1]=='INF' or dp[b]+t2<dp[t1]:
			dp[t1]=dp[b]+t2
			heapq.heappush(q,[dp[b]+t2,t1])
for _ in range(1,V+1):
	print(dp[_])

 

'알고리즘 > 알고리즘문제' 카테고리의 다른 글

[알고리즘] 백준 1002 터렛 파이썬  (0) 2022.07.18
[알고리즘] 백준 2675 문자열 반복  (0) 2022.07.14
동적계획법 - 백준 9184  (0) 2022.07.05
Map - 숫자 카드  (0) 2022.07.04
정렬 - 좌표 압축  (0) 2022.07.04