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

AI์ ๋์์ ๋ฐ์๋ ๋ฌธ์ ๋ค...๐ค
DP + ์์ ์ ๋ ฌ์ ์ฌ์ฉํด์ผํ๋ ๋ฌธ์ ์ธ๋ฐ, DP์ ๋ ๊ฐ๊น์๋ณด์ธ๋ค.
๋ฌธ์ ์์ ๊ตฌํ๊ณ ์ ํ๋๊ฒ์ "ํ์ํ ๊ธฐ๋ณธ๋ถํ์ ์ข
๋ฅ์ ์"์ธ๋ฐ,
๊ธฐ๋ณธ๋ถํ - ์์ ํ ์ฌ์ด ์ค๊ฐ๋ถํ์ด ์กด์ฌํ๋ค.
๊ทธ๋ฆฌ๊ณ ๊ธฐ๋ณธ๋ถํ์ ์ค๊ฐ๋ถํ, ์์ ํ ๋ชจ๋์ ์ฌ์ฉ๋ ์ ์๋ค.
๊ทธ๋ฐ๊ณ ๋ก ์ด ๋ฌธ์ ์ญ์ DFS๋ก ํ๋ ค๋ฉด ์ด์ง ๋ณต์กํด์ง๋ค. (๊ณ๋ณด ๋ณต์๊ฐ ํธ์ ๋ฌธ์ ๋ฅผ ๋ ์ฌ๋ ค๋ณด์...)
BFS๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ง์
์ฐจ์๋ถํฐ ์ ๋ฆฌํด์ค์ผํ๋๋ฐ ๋ฌด์์์ ์ผ๋ก ํ๋ค๊ฐ ์ค์ํ ์๋ ์๋ค.
์ฅ๋๊ฐ์ (๊ธฐ๋ณธ๋ถํ - ์ค๊ฐ๋ถํ - ์์ ํ) ์์ผ๋ก ๋ง๋ค์ด์ ธ์ผํ๋ค.
์ฆ, ๊ธฐ๋ณธ๋ถํ์ด ์ ์ผ ์ฐ์ ์ด ๋์ด์ผ ํ๋๊ฒ์ด๋ค.
๋ฐ๋ผ์ ๊ทธ๋ํ ์ ๋ฆฌ ์ ๊ธฐ๋ณธ๋ถํ์ (์ค๊ฐ๋ถํ/์์ ํ, ํ์ํ ๊ธฐ๋ณธ๋ถํ์ ์)๋ฅผ ์ ์ฅํ๋ค.
์ง์
์ฐจ์ ์ญ์ ์ค๊ฐ๋ถํ/์์ ํ์ 1 ์ฆ๊ฐ์์ผ์ค์ผํ๋ค.
๐ ์ง์
์ฐจ์๊ฐ 0์ธ ๋
ธ๋๊ฐ ๊ธฐ๋ณธ๋ถํ์ด ๋๋ฏ๋ก queue์ ๋ฃ์ด์ค๋ค.;
๊ทธ๋ฆฌ๊ณ 2์ฐจ์ DP ๋ฆฌ์คํธ๋ฅผ ์์ฑํด์ค๋ค.
๐ dp[x][y] = x๋ฅผ ๋ง๋๋๋ฐ ํ์ํ ๊ธฐ๋ณธ๋ถํ y์ ๊ฐฏ์
๋ณธ๊ฒฉ์ ์ธ ์งํ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
- queue์์ ํ์ฌ ๋
ธ๋(
curr)๋ฅผ ๋ฝ์๋. curr๊ณผ ์ฐ๊ฒฐ๋ ๊ทธ๋ํ๋ฅผ ํ์ (์ฐ๊ฒฐ๋ ธ๋, ๊ฐฏ์)- ๋ง์ฝ
dp[curr]์ sum ํ ๊ฐ์ด 0์ด๋ผ๋ฉด?curr์ ๋ง๋๋๋ฐ ํ์ํ ๊ธฐ๋ณธ๋ถํ์ ๊ฐฏ์๊ฐ 0์ด๋ผ๋ ๋ปcurr= ๊ธฐ๋ณธ๋ถํ์ธ ์ ์ด๋ฏ๋กdp[์ฐ๊ฒฐ๋ ธ๋][curr]์ ๊ฐฏ์๋ฅผ ๋ํด์ค
- ๊ธฐ๋ณธ๋ถํ์ด ์๋๋ผ๋ฉด,
curr์ ๋ง๋๋๋ฐ์ ํ์ํ ๊ธฐ๋ณธ๋ถํ์ ์๋ฅผ ๊ฐ์ ธ์ ๊ณ์ฐํด์ค- ๋ชจ๋ ์ฅ๋๊ฐ์ ์ํํ๋ฉฐ ๊ฐฑ์ ์์ผ์ฃผ๊ธฐ
dp[์ฐ๊ฒฐ๋ ธ๋][i] += dp[curr][i] * ๊ฐฏ์- (์ฐ๊ฒฐ๋
ธ๋, ๊ฐฏ์)์์ ๊ฐฏ์๋ ์ฐ๊ฒฐ๋
ธ๋๋ฅผ ๋ง๋๋๋ฐ์ ํ์ํ
curr์ ๊ฐฏ์! - (
curr* ๊ฐฏ์)๋งํผ ํ์ํ๋ฏ๋ก (curr์ ์ฌ์ฉ๋ ๊ธฐ๋ณธ๋ถํ์ ๊ฐฏ์ * ๊ฐฏ์)๋ฅผ ๋ํด์ค์ผํจ
- ์ง์ ์ฐจ์๋ฅผ 1 ๊ฐ์์ํด
- ์ง์ ์ฐจ์๊ฐ 0์ด ๋๋ค๋ฉด, queue์ ์ถ๊ฐํจ
- ๋ง์ฝ
- ๋ชจ๋ ์ฅ๋๊ฐ ๋ฒํธ๋ฅผ ์ฒดํฌํ๋ฉฐ ๊ฒฐ๊ณผ ์ถ๋ ฅ
dp[N][i]: ์์ ํ N์ ๋ง๋๋๋ฐ์ ํ์ํ ๊ธฐ๋ณธ๋ถํ i์ ๊ฐฏ์- ํด๋น ๊ฐ์ด ์์์ผ๊ฒฝ์ฐ, i๋ ๊ธฐ๋ณธ๋ถํ์ธ ์
- (
i, dp[N][i])๋ก (๊ธฐ๋ณธ๋ถํ ๋ฒํธ, ์ฐ์ด๋ ๊ฐฏ์) ์ถ๋ ฅ
์ ์ฒด ์ฝ๋
# DP + BFS ๋ฌธ์
# ๋ฉ๋ชจ๋ฆฌ: 34968KB / ์๊ฐ: 56ms
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)
M = int(input())
for _ in range(M):
X, Y, K = map(int, input().split())
# X๋ฅผ ๋ง๋๋ ค๋ฉด Y๊ฐ K๊ฐ ํ์ํจ.
# => ๋ ๊ธฐ๋ณธ์ด ๋๋ ๋ถํ์ด ๋จผ์ ๋ง๋ค์ด์ ธ์ผํจ.
graph[Y].append((X, K))
in_degree[X] += 1
queue = deque()
for i in range(1, N+1):
if in_degree[i] == 0:
queue.append(i)
# dp[x][y] = x๋ฅผ ๋ง๋๋๋ฐ ํ์ํ ๊ธฐ๋ณธ๋ถํ y์ ๊ฐฏ์
dp = [[0] * (N+1) for _ in range(N+1)]
def bfs():
while queue:
curr = queue.popleft()
# nxt = curr์ cnt๋งํผ ํ์๋ก ํ๋ ๋ถํ
for nxt, cnt in graph[curr]:
# ํ์ํ ๋ถํ์ด 0์ด๋ผ๋ฉด ๊ธฐ๋ณธ๋ถํ์ด๋ผ๋ ๋ป
if sum(dp[curr]) == 0:
dp[nxt][curr] += cnt
else:
# ๊ธฐ๋ณธ๋ถํ์ด ์๋๊ฒฝ์ฐ, curr์ ๋ง๋๋๋ฐ์ ํ์ํ ๊ธฐ๋ณธ๋ถํ i์ ์ * cnt๋ฅผ ๋ํด์ค
for i in range(1, N+1):
dp[nxt][i] += dp[curr][i] * cnt
in_degree[nxt] -= 1
if in_degree[nxt] == 0:
queue.append(nxt)
bfs()
for i in range(1, N+1):
if dp[N][i] > 0:
print(i, dp[N][i])
ํ์ด๋ ํ์ด๋ ์ด๋ ค์ด DP๋ค...
์ค๋๋ ๋ฌธ์ ์ ํ์ด๋ฅผ ์์ฑํ ๋๋ ๋ค์ ํ ๋ฒ ํ์ด๋ณด๋ ํธ์ธ๋ฐ, ๋จธ๋ฆฌ์ ์กด์ฌ ์ด์ ์ ๋ํด ์ง์งํ๊ฒ ๊ณ ๋ฏผํ๋ค^^
์ฐ์ต๋ง์ด ๋ต์ผ์ง๋ค...