https://www.acmicpc.net/problem/20007
시간 1초, 메모리 512MB
input :
output :
조건 :
일단 성현이의 집을 기준으로 최단 거리들을 잡아야 한다.
그래서 다익스트라를 이용하자.
오랜만에 쓰려고 하니까 좀 기억이 안 나기도 했다.
다시 한 번 상기하도록 하자.
다익스트라의 경우 시작하는 지점의 거리를 0으로 초기화를 하며 이 지점을 q에 heapq로 넣어준다.
우선순위 큐를 사용해서 가장 짧은 거리부터 이동하도록 한다.
그리고, 다른 그래프 들과 다르게 다음 노드까지 이동을 했을 때의 거리가 dp 값에 있는 값보다 작은 경우에만 q에 append 하여 준다.
dp = [float('inf')] * n
q = []
heappush(q, (0, y))
dp[y] = 0
while q:
dis, now_node = heappop(q)
if dp[now_node] < dis:
continue
for next_node, next_cost in graph[now_node]:
cost = next_cost + dis
if dp[next_node] > cost:
dp[next_node] = cost
heappush(q, (cost, next_node))
그리고 이 최단 거리가 x보다 큰 경우에는 어떤 짓거리를 해도 성현이가 떡을 돌리지 않으니까 이 경우를 -1ㄹ을 출력하고 exit()를 하자.
그렇기에 왕복의 경우를 다 따져야 해서 거리에 대한 값에 2를 곱해준다.
그리고 날짜를 샐때는 현재까지 이동 거리 + 다음 거리 > x 이면 날짜를 하루 올리고, 현재까지 이동 거리를 다시 0으로 초기화 시키자.
for i in range(len(dp)):
dp[i] *= 2
dp.sort()
if max(dp) > x:
print(-1)
exit()
now, ans = 0, 1
for item in dp:
if now + item > x:
ans += 1
now = 0
now += item
print(ans)
import sys
from heapq import heappop, heappush
n, m, x, y = map(int, sys.stdin.readline().split())
graph = [[] for i in range(n)]
for i in range(m):
a, b, c = map(int, sys.stdin.readline().split())
graph[a].append((b, c))
graph[b].append((a, c))
dp = [float('inf')] * n
q = []
heappush(q, (0, y))
dp[y] = 0
while q:
dis, now_node = heappop(q)
if dp[now_node] < dis:
continue
for next_node, next_cost in graph[now_node]:
cost = next_cost + dis
if dp[next_node] > cost:
dp[next_node] = cost
heappush(q, (cost, next_node))
for i in range(len(dp)):
dp[i] *= 2
dp.sort()
if max(dp) > x:
print(-1)
exit()
now, ans = 0, 1
for item in dp:
if now + item > x:
ans += 1
now = 0
now += item
print(ans)