티스토리 뷰
문제
https://www.acmicpc.net/problem/1005
1005번: ACM Craft
첫째 줄에는 테스트케이스의 개수 T가 주어진다. 각 테스트 케이스는 다음과 같이 주어진다. 첫째 줄에 건물의 개수 N과 건물간의 건설순서 규칙의 총 개수 K이 주어진다. (건물의 번호는 1번부
www.acmicpc.net
풀이
처음 시도한 풀이(시간 초과)
처음에는 단순히 목표 노드에서 연결된 노드를 거꾸로 접근해 가면 dp배열을 업데이트 시켰다.
def d(i: int):
if not graph[i]:
dp[i] = times[i]
return dp[i]
dp[i] = max(map(d, graph[i])) + times[i]
return dp[i]
for _ in range(int(input())):
N, K = map(int, input().split())
times = [0] + list(map(int, input().split()))
graph = [[] for __ in range(N+1)]
dp = [0] * (N+1)
for ___ in range(K):
X, Y = map(int, input().split())
graph[Y].append(X)
W = int(input())
print(d(W))
맞은 풀이
시간 초과 판정을 받고 탑다운 방식이 아닌 바텀업 방식으로 생각해보았다.
진입차수가 0인 노드부터 하나씩 건물 건설에 걸리는 시간을 확정 지어 위상 정렬로 풀 수 있다고 판단했다.
import sys
from collections import deque
input = sys.stdin.readline
for _ in range(int(input())):
N, K = map(int, input().split())
times = [0] + list(map(int, input().split()))
graph = [[] for __ in range(N + 1)]
in_degree = [-1] + [0] * N # 진입 차수 초기화
dp = [0] * (N + 1) # dp 테이블 초기화
for ___ in range(K):
X, Y = map(int, input().split())
graph[X].append(Y)
in_degree[Y] += 1
W = int(input())
q = deque()
for idx, val in enumerate(in_degree):
if val == 0: # 진입 차수가 0이면 큐에 삽입
dp[idx] = times[idx] # 건물 건설에 걸리는 시간 확정
q.append(idx)
while q:
prev = q.popleft()
for next in graph[prev]: # 연결된 노드 탐색
dp[next] = max(dp[next], dp[prev] + times[next]) # 건물 건설에 걸리는 시간 업데이트
in_degree[next] -= 1 # 진입 차수 -1
if in_degree[next] == 0: # 새롭게 진입 차수가 0이된 노드 큐에 삽입
q.append(next)
print(dp[W])
'Problem Solving > 백준' 카테고리의 다른 글
백준 10026번 파이썬 (0) | 2022.07.03 |
---|---|
백준 2263번 파이썬 (0) | 2022.07.01 |
백준 4256번 파이썬 (0) | 2022.06.30 |
백준 3190번 파이썬 (0) | 2022.06.29 |
댓글