ํ์ด ๋ฐฉ๋ฒ
์์ ์ ๋ ฌ topological sorting ๊ณผ DP๋ฅผ ํ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค. ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํด ์ ํฅ ๊ทธ๋ํ๋ฅผ ๋ง๋ค๊ณ , ์ง์ ๊ฐ์ ์ ์๋ฅผ ์ฒดํฌํ๊ธฐ ์ํด degree ๋ฐฐ์ด์ ๋ง๋ค์ด ์ค๋ค. ์ ์ ์ ๋ชจ๋ ๋ด์ ํ๋ ํ๋ ์ ์ธํด ์ค๋ค.
from collections import deque
time = [0] + list(map(int, input().split())) # time to build
result = time.copy()
degree = [0] * (N + 1)
graph = [[] for _ in range(N+1)]
queue = deque([i+1 for i in range(N)])
๋จผ์ , ๊ฑด๋ฌผ์ ์ง๋ ์์ X, Y ๊ฐ ์ฃผ์ด์ง ๋๋ง๋ค ์ธ์ ๋ฆฌ์คํธ๋ก ๊ตฌํ๋ ๊ทธ๋ํ์ ์ฐจ์ ๋ฐฐ์ด์ ์ ๋ฐ์ดํธํ์ฌ ๊ทธ๋ํ๋ฅผ ์์ฑํด ์ค๋ค. ๊ทธ ํ ์์ ์ ๋ ฌ์ ์ฌ์ฉํ์ฌ ๊ฑด๋ฌผ์ ์ง๋ ์์๋๋ก ์ ๋ ฌํ๊ณ , ์์๊ฐ ๊ฒฐ์ ๋ ๋ ๋ง๋ค ํด๋น ์ ์ ๊ณผ ์ธ์ ํ ์ ์ ์ ๊ฑด๋ฌผ์ ์ง์ ๋ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ ๋ฐ์ดํธํ๋ค. ์๋ฅผ ๋ค์ด ๋ฌธ์ ์์ ์ฃผ์ด์ง ๊ฒ๊ณผ ๊ฐ์ ๋ค์ ๊ทธ๋ํ๊ฐ ์๋ค๊ณ ํ์.
๊ทธ๋ํ ์๋ฃ๊ตฌ์กฐ
vertex: 0 - none
vertex: 1 - 2, 3
vertex: 2 - 4
vertex: 3 - 4
์์ ์ ๋ ฌ ์ํ๊ณผ์
ํ์์ ์ ์ 1๋ฅผ pop
์ ์ 1์ ์ง์
๊ฐ์ ์ ์์ต๋๋ค.
์ ์ 1์ ์ธ์ ํ ์ ์ 2์ result ๋ฅผ ์
๋ฐ์ดํธํ๊ณ ๊ฐ์ <1, 2>๋ฅผ ์ญ์ ํฉ๋๋ค.
์ ์ 1์ ์ธ์ ํ ์ ์ 3์ result ๋ฅผ ์
๋ฐ์ดํธํ๊ณ ๊ฐ์ <1, 3>๋ฅผ ์ญ์ ํฉ๋๋ค.
ํ์์ ์ ์ 2๋ฅผ pop
์ ์ 2์ ์ง์
๊ฐ์ ์ ์์ต๋๋ค.
์ ์ 2์ ์ธ์ ํ ์ ์ 4์ result ๋ฅผ ์
๋ฐ์ดํธํ๊ณ ๊ฐ์ <2, 4>๋ฅผ ์ญ์ ํฉ๋๋ค.
ํ์์ ์ ์ 3๋ฅผ pop
์ ์ 3์ ์ง์
๊ฐ์ ์ ์์ต๋๋ค.
์ ์ 3์ ์ธ์ ํ ์ ์ 4์ result ๋ฅผ ์
๋ฐ์ดํธํ๊ณ ๊ฐ์ <3, 4>๋ฅผ ์ญ์ ํฉ๋๋ค.
ํ์์ ์ ์ 4๋ฅผ pop
์ ์ 4์ ์ง์
๊ฐ์ ์ ์์ต๋๋ค.
์์ ์ ๋ ฌ ์ข
๋ฃ
์ํ์ฐฉ์ค
- DFS, DP ๋ฑ๋ฑ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ ๊ณ ๋ฏผํด ๋ณด๋ค๊ฐ ๋์ ํ ์ ๋๊ฒ ์ด์ ๊ฒ์์ ํตํด '์์ ์ ๋ ฌ'์ ์๊ฒ๋์๋ค. ๊ณจ๋ ๋จ๊ณ๋ถํฐ ์ฌ๋ฌ ์๊ณ ๋ฆฌ์ฆ๋ค์ ๋ณต์๋ก ์ ์ฉํ์ฌ ํ์ดํ๋ ๋ฌธ์ ๊ฐ ๋ง์์ง๋ค๊ณ ํ๋ ์ฐธ๊ณ ํ ๊ฒ..
- ์ฒ์์๋ double linked list ์ฒ๋ผ ๊ฐ ์ ์ ์ in&out ๊ฐ์ ์ ๋ชจ๋ ์ ์ฅํ์ผ๋, ์์ ์ ๋ ฌ์๋ ์ง์ ๊ฐ์ ์ ์๋ง ์ฒดํฌํ๋ฉด ๋๋ฏ๋ก degree ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ์๋ค. ๋จ์ํ ๋ต๋ง ๋์จ๋ค๊ณ ๋์ด ์๋๋ผ, ์ต์ ํํ ์ ์๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ฏผํด ๋ณด์.
- ๋ก์ปฌ์์๋ ๋์๊ฐ๋ ์ฝ๋๊ฐ ๋ฐฑ์ค Python3 ์ผ๋ก ์ ์ถํ์ ๋ ์๊ฐ ์ด๊ณผ๋ ๊ฒฝ์ฐ, PyPy3 ์ผ๋ก ์ ์ถํด ๋ณผ ๊ฒ.
์ ์ฒด ์ฝ๋
from collections import deque
T = int(input())
for i in range(T):
N, K = map(int, input().split())
time = [0] + list(map(int, input().split()))
result = time.copy()
degree = [0] * (N + 1)
graph = [[] for _ in range(N+1)]
queue = deque([i+1 for i in range(N)])
# graph as adjacency list
for _ in range(K):
src, des = map(int, input().split())
graph[src].append(des)
degree[des] += 1
# topological sort
while(queue):
v = queue.popleft()
if not degree[v]:
for i in graph[v]:
result[i] = max(result[i], result[v] + time[i])
degree[i] -= 1
else:
queue.append(v)
W = int(input())
print(result[W])
'DevLog ๐จ > Baekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[DevLog][Baekjoon] 8983: ์ฌ๋ฅ๊พผ (0) | 2023.08.16 |
---|---|
[DevLog][Baekjoon] 2110: ๊ณต์ ๊ธฐ ์ค์น (0) | 2023.08.16 |
[DevLog][Baekjoon] 2261: ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ์ (0) | 2023.08.14 |
[DevLog][Baekjoon] 1629: ๊ณฑ์ (0) | 2023.08.14 |
[BaekJoon] 1007: ๋ฒกํฐ ๋งค์นญ (0) | 2023.02.16 |