๐ก ์กฐ๊ฑด
์๊ธฐ 2012๋
! ๋๋์ด 2๋
๊ฐ ์๋ง์ ๊ตญ๋ฏผ๋ค์ ๊ธฐ๋ค๋ฆฌ๊ฒ ํ ๊ฒ์ ACM Craft (Association of Construction Manager Craft)๊ฐ ๋ฐ๋งค๋์๋ค.
์ด ๊ฒ์์ ์ง๊ธ๊น์ง ๋์จ ๊ฒ์๋ค๊ณผ๋ ๋ค๋ฅด๊ฒ ACMํฌ๋ํํธ๋ ๋ค์ด๋๋ฏนํ ๊ฒ์ ์งํ์ ์ํด ๊ฑด๋ฌผ์ ์ง๋ ์์๊ฐ ์ ํด์ ธ ์์ง ์๋ค. ์ฆ, ์ฒซ ๋ฒ์งธ ๊ฒ์๊ณผ ๋ ๋ฒ์งธ ๊ฒ์์ด ๊ฑด๋ฌผ์ ์ง๋ ์์๊ฐ ๋ค๋ฅผ ์๋ ์๋ค.๋งค ๊ฒ์์์ ์ ๊ฑด๋ฌผ์ ์ง๋ ์์๊ฐ ์ฃผ์ด์ง๋ค. ๋ํ ๋ชจ๋ ๊ฑด๋ฌผ์ ๊ฐ๊ฐ ๊ฑด์ค์ ์์ํ์ฌ ์์ฑ์ด ๋ ๋๊น์ง Delay๊ฐ ์กด์ฌํ๋ค.
ํ๋ก๊ฒ์ด๋จธ ์ต๋ฐฑ์ค์ ์ ์ธ๊ณผ์ ๋ฐ์ดํธ ๋น์ฉ์ ๋ง๋ จํ๊ธฐ ์ํด ์๊ฐ๋ํ๊ต๋ฐฐ ACMํฌ๋ํํธ ๋ํ์ ์ฐธ๊ฐํ๋ค! ์ต๋ฐฑ์ค์ ํ๋ คํ ์ปจํธ๋กค ์ค๋ ฅ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๊ฒฝ๊ธฐ์์ ํน์ ๊ฑด๋ฌผ๋ง ์ง๋๋ค๋ฉด ๋ฌด์กฐ๊ฑด ๊ฒ์์์ ์ด๊ธธ ์ ์๋ค.
๋งค ๊ฒ์๋ง๋ค ํน์ ๊ฑด๋ฌผ์ ์ง๊ธฐ ์ํ ์์๊ฐ ๋ฌ๋ผ์ง๋ฏ๋ก ์ต๋ฐฑ์ค์ ์ข์ ํ๊ณ ์์๋ค. ๋ฐฑ์ค์ด๋ฅผ ์ํด ํน์ ๊ฑด๋ฌผ์ ๊ฐ์ฅ ๋นจ๋ฆฌ ์ง์ ๋๊น์ง ๊ฑธ๋ฆฌ๋ ์ต์์๊ฐ์ ์์๋ด๋ ๋ฌธ์ .
์ฒซ์งธ ์ค์๋ ํ
์คํธ์ผ์ด์ค์ ๊ฐ์ T๊ฐ ์ฃผ์ด์ง๋ค. ์ฒซ์งธ ์ค์ ๊ฑด๋ฌผ์ ๊ฐ์ N๊ณผ ๊ฑด๋ฌผ๊ฐ์ ๊ฑด์ค์์ ๊ท์น์ ์ด ๊ฐ์ K์ด ์ฃผ์ด์ง๋ค. (๊ฑด๋ฌผ์ ๋ฒํธ๋ 1๋ฒ๋ถํฐ N๋ฒ๊น์ง ์กด์ฌํ๋ค)
๋์งธ ์ค์๋ ๊ฐ ๊ฑด๋ฌผ๋น ๊ฑด์ค์ ๊ฑธ๋ฆฌ๋ ์๊ฐ D1, D2, ..., DN์ด ๊ณต๋ฐฑ์ ์ฌ์ด๋ก ์ฃผ์ด์ง๋ค. ์
์งธ ์ค๋ถํฐ K+2์ค๊น์ง ๊ฑด์ค์์ X Y๊ฐ ์ฃผ์ด์ง๋ค. (์ด๋ ๊ฑด๋ฌผ X๋ฅผ ์ง์ ๋ค์์ ๊ฑด๋ฌผ Y๋ฅผ ์ง๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค๋ ์๋ฏธ์ด๋ค) ๋ง์ง๋ง ์ค์๋ ๋ฐฑ์ค์ด๊ฐ ์น๋ฆฌํ๊ธฐ ์ํด ๊ฑด์คํด์ผ ํ ๊ฑด๋ฌผ์ ๋ฒํธ W๊ฐ ์ฃผ์ด์ง๋ค.
2 ≤ N ≤ 1000 1 ≤ K ≤ 100,000 1 ≤ X, Y, W ≤ N 0 ≤ Di ≤ 100,000, Di๋ ์ ์
BFS, ๊ทธ๋ํํ์ ์ ํ์ ๋ฌธ์
๐ฅ ์์ค ์ฝ๋
from collections import deque
from sys import stdin
def topology_sort(w):
q = deque()
dp = [0 for _ in range(n + 1)]
for i in range(1, n + 1):
if indegree[i] == 0:
q.append(i)
dp[i] = arr[i]
while q:
now = q.popleft()
for node in graph[now]:
indegree[node] -= 1
dp[node] = max(dp[now] + arr[node], dp[node])
if indegree[node] == 0:
q.append(node)
return dp[w]
for tc in range(int(stdin.readline())):
n, m = map(int, stdin.readline().split())
indegree = [0] * (n + 1)
graph = [[] for _ in range(n + 1)]
arr = [0] + list(map(int, stdin.readline().split()))
for _ in range(m):
a, b = map(int, stdin.readline().split())
graph[a].append(b)
indegree[b] += 1
w = int(stdin.readline())
print(topology_sort(w))
๐ ์์ ๋ฐ ์คํ๊ฒฐ๊ณผ
์์
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
โจ๏ธ ๋ฌธ์ ํ์ด
๋ฌธ์ ๋ฅผ ์์ฝํด๋ณด์๋ฉด, ์๋์ ๊ฐ๋ค.
๊ฐ ํ
์คํธ ์ผ์ด์ค๋ง๋ค ๊ฑด๋ฌผ์ ์ง์ ์ ์๋ ์์๋ ๋ค๋ฅด๋ค.
๋ฐฑ์ค์ด๊ฐ ์ด๊ธฐ๊ธฐ ์ํด์๋ ํน์ ๊ฑด๋ฌผ์ ์ง์ด์ผ ์น๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
ํน์ ๊ฑด๋ฌผ์ ์ง๊ธฐ ์ํด์๋ ์ ํ๋๋ ๊ฑด๋ฌผ์ ์ง์ ํ์๊ฐ ์๋ค.
๊ฐ๋จํ๊ฒ ์ ๋ฆฌ๋ฅผ ํด๋ณด๋ฉด ์ฐ๋ฆฌ๋ ๊ฑด์ค์์๊ฐ ์ ํด์ ธ ์๋ ๊ฑด๋ฌผ์ ์ฐจ๋ก๋ก ๊ฑด์คํ๋ฉด์, W๋ฒ ๊ฑด๋ฌผ์ ์ง์ ๋๊น์ง์ ์ต์ ์๊ฐ์ ๊ตฌํด์ผํ๋ค. ์ด๋ฌํ ๋ฌธ์ ์ ์ฌ์ฉํ ์ ์๋ ์๊ณ ๋ฆฌ์ฆ์ ์์์ ๋ ฌ์ธ๋ฐ, ์์์ ๋ ฌ์ ๊ฐ๋
๊ณ ์์ ์จ๋์ ๊ฒ๊ณผ ๊ฐ๋
์ด ํฌ๊ฒ ๋ค๋ฅด์ง ์๋ค.์์์ ๋ ฌ์ด๋, ์์๊ฐ ์ ํด์ ธ์๋ ์์
์ ์ฐจ๋ก๋ก ์ํํด์ผํ ๋ ๊ทธ ์์๋ฅผ ๊ฒฐ์ ํด์ฃผ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๊ฑด๋ฌผ์ ๊ฐ์ N๊ณผ ๊ฑด๋ฌผ๊ฐ์ ๊ฑด์ค์์ ๊ท์น์ ์ด ๊ฐ์ K ๋ฅผ ์
๋ ฅ๋ฐ์, ์์์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ํ์ํ indegree ๋ฆฌ์คํธ๋ฅผ n + 1 ๊ฐ ๋ง๋ค์ด์ค๋ค. ๋ํ N + 1๊ฐ์ ๋
ธ๋๋ฅผ ๊ฐ์ง ๊ทธ๋ํ๋ ์์ฑํ๋ค. ๊ฐ ๊ฑด๋ฌผ์ ๊ฑด์คํ๋๋ฐ์ ํ์ํ ์๊ฐ์ ์
๋ ฅ๋ฐ์ ํ, ๊ฑด์ค์์๋ฅผ ์
๋ ฅ๋ฐ์ ๊ทธ๋ํ์ ์
๋ ฅํ๋ค. ๋ง์ฝ a, b๋ฅผ ์
๋ ฅ ๋ฐ์๋ค๋ฉด, graph[a].append(b) ์ด๋ฉฐ indegree[b] += 1 ์ด๋ค.b ๊ฑด๋ฌผ์ ๊ฑด์คํ๊ธฐ ์ํด์๋ a ๊ฑด๋ฌผ์ ๊ฑด์คํด์ผํ๋ค๋ ๋ป์ด๊ธฐ ๋๋ฌธ์ +1 ์ด ๋๋ ๊ฒ์ด๋ค.
์ดํ, W ๋ฅผ ์
๋ ฅ๋ฐ์ ์์์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋ก์ง์ด ์๋ topology_sort() ํจ์์ W๋ฅผ ๋๊ฒจ์ค๋ค. ์์์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์์๋, indegree ๋ฆฌ์คํธ์์์ ๊ฐ์ด 0์ธ ๊ฒ์ q์ ๋จผ์ ๋ฃ๊ณ ์ฒ๋ฆฌ๋ฅผ ํ๋ค. indegree ๋ฆฌ์คํธ์์์ ๊ฐ์ ํด๋น ๊ฑด๋ฌผ์ด ์ง์ด์ง๊ธฐ ์ํด์๋ ๋จผ์ ์ง์ด์ ธ์ผํ ๊ฑด๋ฌผ์ด ์๋ค๋ ๊ฒ์ ์๋ฏธํ๊ธฐ ๋๋ฌธ์ด๋ค.
์์์ ๋ ฌ ํจ์์์๋ DP ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด ์ฌ์ฉ์๊ฐ ์ด๋ค ๊ฑด๋ฌผ์ ์ง์์ ๋์ ์์์๊ฐ์ ์ฒดํฌํ๋ค. ํ์์ ๋บ ๊ฑด๋ฌผ ๋ฒํธ(now) ๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ํ๋ฅผ ๋ฐ๋ผ ์ํํ๋ฉด์, ์ํํ๋ ๊ฑด๋ฌผ์ ๋ฒํธ(node)์ ํด๋นํ๋ indegree์ ๊ฐ์ 1์ฉ ๋นผ์ค๋ค. ๊ทธ๋ฆฌ๊ณ DP[node] ์ ํด๋นํ๋ ๊ฐ์ DP[now] + ๊ฑด์ค์ ํ์ํ ์๊ฐ[node] ๊ฐ๊ณผ ๋น๊ตํด ๊ฐ์ฅ ํฐ ๊ฐ์ผ๋ก ๊ฐฑ์ ํ๋ค.
์ดํ, indegree[node] ์ ๊ฐ์ด 0 ์ด๋ผ๋ฉด queue์ ์ถ๊ฐํ๊ณ ๋ฐ๋ณตํ๋ค. queue ๊ฐ ๋ชจ๋ ๋น ๋๊น์ง ์ํ๋ฅผ ๋ง์ณค๋ค๋ฉด, DP[W] ์ ๊ฐ์ ๋ฐํํ๊ณ ์ถ๋ ฅํ๋ค. DP[W]์ ๊ฐ์ W ๋ฒ ๊ฑด๋ฌผ์ด ์ง์ด์ง๋ ์ต์ ์๊ฐ์ ์๋ฏธํ๋ค.
๐พ ๋ฐฐ์ด์
์์์ ๋ ฌ์ด๋, ์์๊ฐ ์ ํด์ ธ์๋ ์์
์ ์ฐจ๋ก๋ก ์ํํด์ผํ ๋ ๊ทธ ์์๋ฅผ ๊ฒฐ์ ํด์ฃผ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ ์๊ณ ๋ฆฌ์ฆ. ์ด๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ๊ณ , ์์ฉํด์ผํ ์ง ๋ ์ฐ์ต์ด ํ์ํ ๊ฒ ๊ฐ๋ค. ๋ณต์กํด๋ณด์ด์ง๋ง, ๊ฐ๋
๊ณผ ํ์ํ ์ํฉ์ ์ ์ดํดํ๋ค๋ฉด ์ถฉ๋ถํ ์ ์ฌ์ฉํ ์ ์์ ๊ฒ ๊ฐ์ ๋๋์ด๋ค.