๋ฌธ์
https://www.acmicpc.net/problem/2056
๋ฐฑ์ค ๋ฌธ์ ์ง - 0x1A๊ฐ - ์์ ์ ๋ ฌ
์๊ณ ๋ฆฌ์ฆ: ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ, ๋ฐฉํฅ ๋น์ํ ๊ทธ๋ํ, ์์ ์ ๋ ฌ
ํ์ด

๐๏ธ DP + ์์์ ๋ ฌ ๋ฌธ์ ๋ค.
๊ฐ ์์
์ ์ ํ ์์
์ด ๋๋ ์ดํ๋ถํฐ ์์ํ ์ ์๊ณ , ์๋ก ์ ํ๊ด๊ณ๊ฐ ์๋ ์์
๋ค์ ๋ณ๋ ฌ์ ์ผ๋ก ์์
ํ ์ ์๋ค.
์ฆ, ํ์ฌ ์์
์ ์ ํ ์์
๋ค ์ค ๊ฐ์ฅ ๋ฆ๊ฒ๋๋๋ ์์
์ ์์ ๊ธฐ์ค์ผ๋ก ์ผ์์ผํ๋ค.
์ผ๋จ A: ์ ํ์์
, B: ํ ์์
์ผ ๋ A → B ํํ๋ก ์ง์
์ฐจ์๋ฅผ ์ ๋ฆฌํด์ค๋ค.
๊ทธ๋ฆฌ๊ณ DP ๋ฆฌ์คํธ๋ฅผ ์์ฑ ํ, ์ง์
์ฐจ์๊ฐ 0์ธ ์์
๋ค์ ์ฐพ๋๋ค.
ํด๋น ์์
๋ค์ DP๊ฐ์ ์ฃผ์ด์ง ์์
์๊ฐ๊ฐ์ผ๋ก ๊ฐฑ์ ํ, ์์
๋ฒํธ๋ฅผ queue์ ์ฝ์
ํ๋ค.
BFS๋ฅผ ์คํํ๋ฉฐ DP๊ฐ๋ค์ ๊ฐฑ์ ์์ผ์ค๋ค. ๊ณผ์ ์ ์๋์ ๊ฐ๋ค.
- queue์์ ๋ ธ๋๋ฅผ ๊บผ๋
- ๊บผ๋ธ ๋
ธ๋(A)์ ๋ค์ ์์
๋ค(B)์ ํ๋์ฉ ํ์ํ๋ค.
- ์ง์ ์ฐจ์๋ฅผ 1 ๊ฐ์์์ผ์ค
DP[B]์ ๊ฐ์ ๊ฐฑ์ ํจ- (๊ธฐ์กด DP๊ฐ), (A์ DP๊ฐ + B์ ์์ ์๊ฐ) ์ค ๋ ํฐ ๊ฐ์ ์ ํ
- ์ง์ ์ฐจ์๊ฐ 0์ด ๋๋ค๋ฉด queue์ ์์ (B) ์ฝ์
์๋ ์์ 1 ๋ฐ์ดํฐ๋ก ์งํ ๊ณผ์ ์ ์ดํด๋ณด์.
7
5 0
1 1 1
3 1 2
6 1 1
1 2 2 4
8 2 2 4
4 3 3 5 6
์ ํ ๊ด๊ณ๋ฅผ ์ ๋ฆฌํ๋ฉด,
1 = [] # 1๋ฒ ์์
์ ์ ํ ์์
์์
2 = [1] # 2๋ฒ ์์
์ 1๋ฒ ์์
์ด ๋๋ ํ ์์ ๊ฐ๋ฅ
3 = [2] # 3๋ฒ ์์
์ 2๋ฒ ์์
์ด ๋๋ ํ ์์ ๊ฐ๋ฅ
4 = [1] # 4๋ฒ ์์
์ 1๋ฒ ์์
์ด ๋๋ ํ ์์ ๊ฐ๋ฅ
5 = [2, 4] # 5๋ฒ ์์
์ 2๋ฒ, 4๋ฒ์ด ๋๋ ํ ์์ ๊ฐ๋ฅ
6 = [2, 4] # 6๋ฒ ์์
์ 2๋ฒ, 4๋ฒ์ด ๋๋ ํ ์์ ๊ฐ๋ฅ
7 = [3, 5, 6] # 7๋ฒ ์์
์ 3, 5, 6์ด ๋๋ ํ ์์ ๊ฐ๋ฅ
์ด๋ ๊ฒ ๋๋ค.
DP ๊ฐฑ์ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
๐ 1๋ฒ ์์ ์ด ๋๋ ํ - 2, 4๋ฒ ์์ ์์ ๊ฐ๋ฅ
dp[2] = dp[1] + time[2] = 5 + 1 = 6
dp[4] = dp[1] + time[4] = 5 + 6 = 11
๐ 2๋ฒ ์์ ์ด ๋๋ ํ - 3, 5, 6๋ฒ ์์ ์์ ๊ฐ๋ฅ
dp[3] = max(dp[3], dp[2] + time[3]) = max(0, 6 + 3) = 9
dp[5] = max(dp[5], dp[2] + time[5]) = max(0, 6 + 1) = 7
dp[6] = max(dp[6], dp[2] + time[6]) = max(0, 6 + 8) = 14
๐ 4๋ฒ ์์ ์ด ๋๋ ํ - 5, 6๋ฒ ์์ ์๊ฐ ๊ฐฑ์ ๊ฐ๋ฅ
dp[5] = max(dp[5], dp[4] + time[5]) = max(7, 11 + 1) = 12
dp[6] = max(dp[6], dp[4] + time[6]) = max(14, 11 + 8) = 19
๐ 5, 6, 3๋ฒ ์์ ์ด ๋๋ ํ - 7๋ฒ ์์ ์์ ๊ฐ๋ฅ
dp[7] = max(dp[7], dp[3] + time[7]) = max(0, 9 + 4) = 13
dp[7] = max(dp[7], dp[5] + time[7]) = max(13, 12 + 4) = 16
dp[7] = max(dp[7], dp[6] + time[7]) = max(16, 19 + 4) = 23
์ ์ฒด ์ฝ๋
# โญ DP + BFS ๋ฌธ์
# ๋ฉ๋ชจ๋ฆฌ: 39632KB / ์๊ฐ: 332ms
from sys import stdin
from collections import deque
input = stdin.readline
N = int(input())
graph = [[] for _ in range(N+1)]
in_degree = [0] * (N+1)
time = [0] * (N+1) # ๊ฐ ์์
๋ค์ ์์์๊ฐ
for i in range(1, N+1):
t, m, *nodes = map(int, input().split())
time[i] = t
if m != 0:
in_degree[i] += m # ํ์ฌ ๋
ธ๋์ ์ง์
์ฐจ์ ๊ธฐ๋ก
for node in nodes:
graph[node].append(i) # ์ ํ๋
ธ๋ -> ํ์ฌ๋
ธ๋๋ก ์ฐ๊ฒฐ๋ ์ ์๊ฒ ์ ์ฅ
def bfs() -> int:
queue = deque()
dp = [0] * (N+1) # dp[x] = x์์
๊น์ง ๋ง์น๋๋ฐ์ ๊ฑธ๋ฆฌ๋ ์ต๋ ์์์๊ฐ
for i in range(1, N+1):
# ์ง์
์ฐจ์๊ฐ 0์ธ ์์
๋ค์ ํ์ ๋ฃ์ด์ฃผ๊ณ dp ์
๋ฐ์ดํธ
if in_degree[i] == 0:
queue.append(i)
dp[i] = time[i]
while queue:
curr = queue.popleft()
for node in graph[curr]:
in_degree[node] -= 1
# ์ ํ์์
ํ ํ์ฌ์์
์ ์ํํ๋๋ฐ์ ๊ฑธ๋ฆฌ๋ ์๊ฐ
# ์ด์ ์ ํ์์
์ค ๊ฐ์ฅ ๋ง์ด ์์๋๋ ์์
์ด ๋๋ ํ์ ํ์ฌ ์์
์ ์์ํ ์ ์์.
dp[node] = max(dp[node], dp[curr] + time[node])
if in_degree[node] == 0:
queue.append(node)
return max(dp)
print(bfs())
DP ๋ฌธ์ ๋ ํ์ด๋ ํ์ด๋ ํท๊ฐ๋ฆฌ๊ณ ... ์ด๋ ต๋ค ์์ง ใ ใ ใ