BOJ 2007 떡 돌리기
https://www.acmicpc.net/problem/20007
시간 1초, 메모리 512MB
input :
- N, M, X, Y (2 ≤ N ≤ 1,000, 1 ≤ M ≤ 100,000, 1 ≤ X ≤ 10,000,000, 0 ≤ Y < N)
- A B C(0 ≤ A,B < N, 1 ≤ C ≤ 10,000)
output :
- 성현이의 집을 Y 라고 할 때, 이웃집 모두에 떡을 돌리기 위한 최소 일을 출력
- 모두 방문할수 없으면 -1을 출력
조건 :
- 떡은 한번에 하나씩만 들고 갈 수 있다.
- 하루에 X보다 먼 거리를 걷지 않고 거리가 가까운 집부터 방문(다익스트라 필요)
- 잠은 꼭 본인 집에서 자야 하므로 왕복할 수 없는 거리는 다음날 가기로 다짐
일단 성현이의 집을 기준으로 최단 거리들을 잡아야 한다.
그래서 다익스트라를 이용하자.
오랜만에 쓰려고 하니까 좀 기억이 안 나기도 했다.
다시 한 번 상기하도록 하자.
다익스트라의 경우 시작하는 지점의 거리를 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)
Author And Source
이 문제에 관하여(BOJ 2007 떡 돌리기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jsin2475/BOJ-2007-떡-돌리기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)