문제 링크
LV 4: 지우는 소수를 좋아해
구현 방식
- dijkstra 응용 문제이다
- costs 또는 distances table 대신에 levels table을 정의해주었다
- dijkstra(1)을 수행해주면, levels table에는 1번 체육관에서부터 각 체육관까지 도달 가능한 최소 레벨이 저장됨
- tlevel = max(clevel, nlevel)으로 할당해주고, tlevel < levels[next]를 만족한다면 levels[next]를 갱신해주고 해당 노드를 heap에 추가한다
- 최소 비용 경로 -> dijkstra (dijkstra는 최소 비용 경로라면, 중복 노드 방문도 가능함)
코드
import sys
import heapq
import math
N, M = map(int, sys.stdin.readline().split())
edges = dict()
for m in range(M):
A, B, C = map(int, sys.stdin.readline().split())
if A in edges: edges[A].append((B, C))
else: edges[A] = [(B, C)]
if B in edges: edges[B].append((A, C))
else: edges[B] = [(A, C)]
def isPrime(x):
for i in range(2, int(math.sqrt(x))+1):
if x%i==0: return False
return True
def dijkstra(start):
levels[start] = 0
heap = []
heapq.heappush(heap, [levels[start], start])
while heap:
clevel, curr = heapq.heappop(heap)
if clevel > levels[curr]: continue
if curr in edges:
for next, nlevel in edges[curr]:
tlevel = max(clevel, nlevel)
if tlevel < levels[next]:
levels[next] = tlevel
heapq.heappush(heap, [tlevel, next])
levels = [int(1e9) for i in range(N+1)]
dijkstra(1)
answer = levels[N]+1
if isPrime(answer): print(answer)
else:
answer += 1
while True:
if isPrime(answer): print(answer); break
answer += 1