[BOJ][๐ก3][๋ฐฑ์ค#01005] ACM Craft
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold III
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
์๊ธฐ 2012๋ ! ๋๋์ด 2๋ ๊ฐ ์๋ง์ ๊ตญ๋ฏผ๋ค์ ๊ธฐ๋ค๋ฆฌ๊ฒย ํ ๊ฒ์ ACM Craft (Association of Construction Manager Craft)๊ฐ ๋ฐ๋งค๋์๋ค. ์ด ๊ฒ์์ ์ง๊ธ๊น์ง ๋์จ ๊ฒ์๋ค๊ณผ๋ ๋ค๋ฅด๊ฒ ACMํฌ๋ํํธ๋ ๋ค์ด๋๋ฏนํ ๊ฒ์ ์งํ์ ์ํด ๊ฑด๋ฌผ์ ์ง๋ ์์๊ฐ ์ ํด์ ธ ์์ง ์๋ค. ์ฆ, ์ฒซ ๋ฒ์งธ ๊ฒ์๊ณผ ๋ ๋ฒ์งธ ๊ฒ์์ด ๊ฑด๋ฌผ์ ์ง๋ ์์๊ฐ ๋ค๋ฅผ ์๋ ์๋ค. ๋งค ๊ฒ์์์ ์ ๊ฑด๋ฌผ์ ์ง๋ ์์๊ฐ ์ฃผ์ด์ง๋ค. ๋ํ ๋ชจ๋ ๊ฑด๋ฌผ์ ๊ฐ๊ฐ ๊ฑด์ค์ ์์ํ์ฌ ์์ฑ์ด ๋ ๋๊น์ง Delay๊ฐ ์กด์ฌํ๋ค. ย
์์ ์์๋ฅผ ๋ณด์. ์ด๋ฒ ๊ฒ์์์๋ ๋ค์๊ณผ ๊ฐ์ด ๊ฑด์ค ์์ ๊ท์น์ด ์ฃผ์ด์ก๋ค.ย 1๋ฒ ๊ฑด๋ฌผ์ ๊ฑด์ค์ด ์๋ฃ๋๋ค๋ฉด 2๋ฒ๊ณผ 3๋ฒ์ ๊ฑด์ค์ ์์ํ ์ ์๋ค. (๋์์ ์งํ์ด ๊ฐ๋ฅํ๋ค)ย ๊ทธ๋ฆฌ๊ณ 4๋ฒ ๊ฑด๋ฌผ์ ์ง๊ธฐ ์ํด์๋ 2๋ฒ๊ณผ 3๋ฒ ๊ฑด๋ฌผ์ด ๋ชจ๋ ๊ฑด์ค ์๋ฃ๋์ด์ผ์ง๋ง 4๋ฒ๊ฑด๋ฌผ์ ๊ฑด์ค์ ์์ํ ์ ์๋ค. ๋ฐ๋ผ์ 4๋ฒ๊ฑด๋ฌผ์ ๊ฑด์ค์ ์๋ฃํ๊ธฐ ์ํด์๋ ์ฐ์ ์ฒ์ 1๋ฒ ๊ฑด๋ฌผ์ ๊ฑด์คํ๋๋ฐ 10์ด๊ฐ ์์๋๋ค. ๊ทธ๋ฆฌ๊ณ 2๋ฒ ๊ฑด๋ฌผ๊ณผ 3๋ฒ ๊ฑด๋ฌผ์ ๋์์ ๊ฑด์คํ๊ธฐ ์์ํ๋ฉด 2๋ฒ์ 1์ด๋ค์ ๊ฑด์ค์ด ์๋ฃ๋์ง๋ง ์์ง 3๋ฒ ๊ฑด๋ฌผ์ด ์๋ฃ๋์ง ์์์ผ๋ฏ๋ก 4๋ฒ ๊ฑด๋ฌผ์ ๊ฑด์คํ ์ ์๋ค. 3๋ฒ ๊ฑด๋ฌผ์ด ์์ฑ๋๊ณ ๋๋ฉด ๊ทธ๋ 4๋ฒ ๊ฑด๋ฌผ์ ์ง์์ ์์ผ๋ฏ๋ก 4๋ฒ ๊ฑด๋ฌผ์ด ์์ฑ๋๊ธฐ๊น์ง๋ ์ด 120์ด๊ฐ ์์๋๋ค. ํ๋ก๊ฒ์ด๋จธ ์ต๋ฐฑ์ค์ ์ ์ธ๊ณผ์ ๋ฐ์ดํธ ๋น์ฉ์ ๋ง๋ จํ๊ธฐ ์ํด ์๊ฐ๋ํ๊ต๋ฐฐ ACMํฌ๋ํํธ ๋ํ์ ์ฐธ๊ฐํ๋ค! ์ต๋ฐฑ์ค์ ํ๋ คํ ์ปจํธ๋กค ์ค๋ ฅ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๊ฒฝ๊ธฐ์์ ํน์ ๊ฑด๋ฌผ๋ง ์ง๋๋ค๋ฉด ๋ฌด์กฐ๊ฑด ๊ฒ์์์ ์ด๊ธธ ์ ์๋ค.ย ๊ทธ๋ฌ๋ ๋งค ๊ฒ์๋ง๋ค ํน์ ๊ฑด๋ฌผ์ ์ง๊ธฐ ์ํ ์์๊ฐ ๋ฌ๋ผ์ง๋ฏ๋ก ์ต๋ฐฑ์ค์ ์ข์ ํ๊ณ ์์๋ค.ย ๋ฐฑ์ค์ด๋ฅผ ์ํด ํน์ ๊ฑด๋ฌผ์ ๊ฐ์ฅ ๋นจ๋ฆฌ ์ง์ ๋๊น์ง ๊ฑธ๋ฆฌ๋ ์ต์์๊ฐ์ ์์๋ด๋ ํ๋ก๊ทธ๋จ์ ์์ฑํด์ฃผ์.
์ ๋ ฅ
์ฒซ์งธ ์ค์๋ ํ ์คํธ์ผ์ด์ค์ ๊ฐ์ T๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ํ ์คํธ ์ผ์ด์ค๋ ๋ค์๊ณผ ๊ฐ์ด ์ฃผ์ด์ง๋ค.ย ์ฒซ์งธ ์ค์ ๊ฑด๋ฌผ์ ๊ฐ์ N๊ณผ ๊ฑด๋ฌผ๊ฐ์ ๊ฑด์ค์์ ๊ท์น์ ์ด ๊ฐ์ K์ด ์ฃผ์ด์ง๋ค.ย (๊ฑด๋ฌผ์ ๋ฒํธ๋ 1๋ฒ๋ถํฐ N๋ฒ๊น์ง ์กด์ฌํ๋ค)ย ๋์งธ ์ค์๋ ๊ฐ ๊ฑด๋ฌผ๋น ๊ฑด์ค์ ๊ฑธ๋ฆฌ๋ ์๊ฐ D1, D2, โฆ, DN์ด ๊ณต๋ฐฑ์ ์ฌ์ด๋ก ์ฃผ์ด์ง๋ค.ย ์ ์งธ ์ค๋ถํฐ K+2์ค๊น์ง ๊ฑด์ค์์ X Y๊ฐ ์ฃผ์ด์ง๋ค.ย (์ด๋ ๊ฑด๋ฌผ X๋ฅผ ์ง์ ๋ค์์ ๊ฑด๋ฌผ Y๋ฅผ ์ง๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค๋ ์๋ฏธ์ด๋ค)ย ๋ง์ง๋ง ์ค์๋ ๋ฐฑ์ค์ด๊ฐ ์น๋ฆฌํ๊ธฐ ์ํด ๊ฑด์คํด์ผย ํ ๊ฑด๋ฌผ์ ๋ฒํธ W๊ฐ ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
๊ฑด๋ฌผ W๋ฅผ ๊ฑด์ค์๋ฃ ํ๋๋ฐ ๋๋ ์ต์ ์๊ฐ์ ์ถ๋ ฅํ๋ค.ย ํธ์์ ๊ฑด๋ฌผ์ ์ง๋ ๋ช ๋ น์ ๋ด๋ฆฌ๋ ๋ฐ๋ ์๊ฐ์ด ์์๋์ง ์๋๋ค๊ณ ๊ฐ์ ํ๋ค. ๊ฑด์ค์์๋ ๋ชจ๋ ๊ฑด๋ฌผ์ด ๊ฑด์ค ๊ฐ๋ฅํ๋๋ก ์ฃผ์ด์ง๋ค.
์ ํ
2ย โค N โค 1000 1 โค K โค 100,000 1 โค X, Y, W โค N 0 โค Di โค 100,000, Di๋ ์ ์
์์
์์ 1
์ ๋ ฅ
2
4 4
10 1 100 10
1 2
1 3
2 4
3 4
4
8 8
10 20 1 5 8 7 1 43
1 2
1 3
2 4
2 5
3 6
5 7
6 7
7 8
7
์ถ๋ ฅ
120
39
์์ 2
์ ๋ ฅ
5
3 2
1 2 3
3 2
2 1
1
4 3
5 5 5 5
1 2
1 3
2 3
4
5 10
100000 99999 99997 99994 99990
4 5
3 5
3 4
2 5
2 4
2 3
1 5
1 4
1 3
1 2
4
4 3
1 1 1 1
1 2
3 2
1 4
4
7 8
0 0 0 0 0 0 0
1 2
1 3
2 4
3 4
4 5
4 6
5 7
6 7
7
์ถ๋ ฅ
6
5
399990
2
0
My Sol
import sys
input = sys.stdin.readline
sys.setrecursionlimit(200000)
def calc_time(n):
global build_first, times, is_built
if is_built[n] != -1:
return is_built[n]
if not build_first[n]:
return times[n]
max_time = 0
for first in build_first[n]:
ret = calc_time(first)
if max_time < ret:
max_time = ret
is_built[n] = max_time + times[n]
return is_built[n]
T = int(input())
for _ in range(T):
N, K = map(int, input().split())
times = [0]+list(map(int, input().split()))
build_first = [[] for _ in range(N + 1)]
is_built = [-1]*(N+1)
for _ in range(K):
a, b = map(int, input().split())
build_first[b].append(a)
W = int(input())
print(calc_time(W))
๊ณจ๋ 3์ ๋์ด๋๋ฅผ ์๊ฐํ๋ฉด ๊ทธ๋ฆฌ ์ด๋ ต์ง ์๊ฒ ์ ๊ทผํ ์ ์๋ ๋ฌธ์ ์๋ค. ์ฌ๊ท์ memoization์ ํ์ฉํ๋ค.
- ์ ๋ ฅ์ ์ฒ๋ฆฌํ๋๋ฐ, b๋ฅผ ์ง๊ธฐ ์ ์ a๋ฅผ ์ง์ด์ผ ํ๊ธฐ ๋๋ฌธ์ build_first[b]์ ์์น์ a๋ฅผ appendํด์ค๋ค.
- W๋ฅผ ์ง๋ ์๊ฐ์ธ calc_time(W)๋ฅผ ์ถ๋ ฅํ๋๋ฐ, W๊ฐ ์ง์ด์ง๊ธฐ ์ํด ๋จผ์ ์ง์ด์ ธ์ผ ํ๋ ๋ฒํธ์ ๋ชฉ๋ก์ธ build_first[W]์ ๋ชฉ๋ก์ ๋ฒํธ๋ค ์ค ํด๋น ๋ฒํธ๋ฅผ ์ง๊ธฐ๊น์ง ๊ฐ์ฅ ์ค๋ ๊ฑธ๋ฆฌ๋ ์๊ฐ + W๋ฅผ ์ง๋ ์๊ฐ์ด๋ค.
- ๋ง์ฝ ์ด๋ค ๋ฒํธ๋ฅผ ์ง๊ธฐ ์ ์ ์ฌ์ ์ ์ง์ด์ ธ์ผํ๋ ๋ชฉ๋ก์ด ๋น์ด์๋ค๋ฉด ํด๋น ๊ฑด๋ฌผ์ ๋ฐ๋ก ์ง์ ์ ์์ผ๋ฏ๋ก times์์ ๋ฐ๋ก ๋ฝ์์ returnํ๋ค.
- ๋ง์ฝ ์ด๋ค ๊ฑด๋ฌผ์ด ์ง์ด์ง๋ ์๊ฐ์ด ๊ฒฐ์ ๋์๋ค๋ฉด returnํ๊ธฐ ์ ์ memoization ๋ฐฐ์ด์ธ is_built์ ๊ธฐ๋กํ๋ค.
- ์ด๋ ๋ค๋ฅธ ์ฌ๊ท์์ ํด๋น ๊ฑด๋ฌผ์ ์ง๋ ์๊ฐ์ ์กฐํํ๊ธฐ ์ํด ์ฌ๊ท์ ์ฐ์์ ์ฌํํ๋ ๊ฒ์ด ์๋, is_built์์ ๋ฐ๋ก ๊ฐ์ ๊ฐ์ ธ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ถํ์ํ ๋ฐ๋ณต ์๊ฐ์ ์ ์ฝํ ์ ์๋ค.
์ ๋ ฅ์ ํฌ๊ธฐ๊ฐ ํฌ๊ธฐ ๋๋ฌธ์ import sys; input = sys.stdin.readline; ์ผ๋ก ์ ๋ ฅ์ ๋น ๋ฅด๊ฒ ๋ฐ์ ์ฒ๋ฆฌํ ํ์๊ฐ ์์๋ค.
๋ํ ์ฃผ์ํ ์ ์ ๊ฑด๋ฌผ์ ์ง๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด ์ต์ 0์ด๋ผ๋ ๊ฒ์ด๊ณ , ์ด ๋๋ฌธ์ is_built์ ์ด๊ธฐ๊ฐ์ 0์ผ๋ก ๋์ด ํ๋จํ๋ ๊ฒ์ด ํจ์ธ์ด ๋์ด ์ฌ๋ฌ ๋ฒ โํ๋ ธ์ต๋๋คโ๋ฅผ ๋ง์ฃผํ๋ค. ๊ทธ๋์ ์ด๊ธฐ๊ฐ์ -1๋ก ๋์๋ค.
๋ ํ ๊ฐ์ง๋ ๋ฐ๋ณต์ 10๋ง ํ ์ด์ ๋ฐ๋ณตํ๋ ์ํฉ์ ๋๋นํ์ฌ ๊ธฐ๋ณธ๊ฐ์ธ recursionLimit์ 20๋ง ํ๋ก ๋๋ํ ์ฌ์ค์ ํด์ฃผ์๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋๊ธ๋จ๊ธฐ๊ธฐ