https://www.acmicpc.net/problem/1005
ํ์ด ๊ณผ์
์ฒ์์ for ๋ฌธ์ ์ฌ์ฉํด์ ํ์๋ค. ์์ ๊ธฐ์ค์ผ๋ก 1 2 3 4์ฒ๋ผ ์์๋๋ก์ธ ๊ฒฝ์ฐ๋ ์ ๋ต์ด ๋ง์ง๋ง.
3 -> 2 -> 1๊ณผ ๊ฐ์ด ์์๊ฐ ๊ฑฐ๊พธ๋ก์ธ ๊ฒฝ์ฐ ๋ต์ด ํ๋ฆฌ๊ฒ ๋์จ๋ค.
์์๋ฅผ ๋ด๊ฐ ์ํ๋ ๋๋ก ์ ํ๋ฉด ํด๊ฒฐ์ด ๋ ๊ฑฐ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฐพ์๋ณด๋ ๋์ค ์์ ์ ๋ ฌ์ด๋ผ๋ ๊ฒ์ ์์๋ค.
ํ๋ฅผ ์ฌ์ฉํด์ ์ง์ ์ฐจ์๊ฐ 0์ธ ๊ฒ๋ค์ ๊ทธ๋ํ์์ popํด์ฃผ๋ฉฐ ์ ๋ ฌํด์ฃผ๋ฉด ๋๋ค.
์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด node 1 ~ 4๊น์ง ์ง์ ์ฐจ์๊ฐ ๊ฐ๊ฐ 0 1 1 2์ด๋ค. ์ด๋ฌ๋ฉด ์ง์ ์ฐจ์๊ฐ 0์ธ node 1์ ํ์ ๋ฃ๊ณ node 2, 3์ ์ง์ ์ฐจ์๋ฅผ 1 ๊ฐ์ ์์ผ ์ฃผ๋ฉด ๋๋ค. ์ดํ ์ง์ ์ฐจ์๊ฐ 0์ด ๋ node 2, 3์ ํ์ ๋ฃ๋๋ค. ์ด ๋์์ ๋ฐ๋ณตํ๋ฉด ์์ ์ ๋ ฌ์ ํ๋ค.
node 4์ ๊ฐ์ด ์ง์ ์ฐจ์๊ฐ 2 ์ด์์ธ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์ด ๊ฒฝ์ฐ node 4์ ๊ฑด์ค ์๋ฃ ์๊ฐ์ ๊ณ์ฐ ํ ๋ node 2์ 3๊ฐ ๊ฑด์ค๋ ๋๊น์ง ์๊ฐ ์ค ์ค๋ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๋ํด์ฃผ๋ฉด ๋๋ค.
from collections import deque
import sys
input = sys.stdin.readline
T = int(input().rstrip())
for _ in range(T):
N, K = map(int,input().rstrip().split())
D = [0]
D.extend([int(x) for x in input().rstrip().split()]) # n๋ฒ์งธ ๊ฑด๋ฌผ ๊ฑด์ค ์๊ฐ
in_degree = [0 for _ in range(N + 1)] # n๋ฒ์งธ node ์ง์
์ฐจ์
adj_list_out = [[] for i in range(N + 1)] # n๋ฒ์งธ ๋
ธ๋์์ out์ธ ๋
ธ๋ ์ ์ฅ
adj_list_in = [[] for i in range(N + 1)] # n๋ฒ์งธ ๋
ธ๋์์ in์ธ ๋
ธ๋ ์ ์ฅ
deq = deque()
toposort = []
Dtime = [0 for i in range(N + 1)] # n๋ฒ์งธ ๊ฑด์ค๊น์ง ์์๋๋ ์๊ฐ
for i in range(K):
x, y = map(int,input().rstrip().split())
adj_list_out[x].append(y)
adj_list_in[y].append(x)
in_degree[y] += 1
W = int(input())
์ฃผ์ด์ง ์ ๋ ฅ๊ฐ๋ค์ ์ ์ธ ํ๊ณ ์ค๋ช ํ๋ฉด ์์ ์ ๋ ฌํ๊ธฐ ์ํด in_dgree์ adj_list_out ๋ฆฌ์คํธ๋ฅผ ์ ์ธํด์ค๋ค.
์ ๋ ฌ๋ ๊ฐ๋ค์ toposort ๋ฆฌ์คํธ์ ์ ์ฅํด์ค๋ค. Dtime์ n๋ฒ์งธ ๊ฑด๋ฌผ๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ ์ฅํด์ค๋ค.
for i in range(1,N + 1):
if in_degree[i] == 0:
deq.append(i)
while deq:
node = deq.popleft()
toposort.append(node)
for s in adj_list_out[node]:
in_degree[s] -= 1
if in_degree[s] == 0:
deq.append(s)
์ด ํํธ๋ ์์ ์ ๋ ฌ์ ์ํ ์ฝ๋๋ค. ๊ฐ์ฅ ๋จผ์ ์ง์ ์ฐจ์๊ฐ 0์ธ ๊ฐ๋ค์ ํ์ ๋ฃ์ด์ค๋ค.
์ดํ ํ๊ฐ ์์ ํ ๋น์์ง๋๊น์ง node๋ค์ ํ๋์ฉ pop ํ๋ฉด์ ํด๋น ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ๋ ธ๋๋ค์ indegree๊ฐ๋ค์ ๊ฐ์์์ผ์ค๋ค.
๊ฐ์์ํจ ์ด ํ ๊ทธ ๋ ธ๋์ ์ง์ ์ฐจ์๊ฐ 0์ด ๋๋ฉด ํ์ ์ถ๊ฐํด์ค๋ค.
for i in toposort:
count = 0
for b in adj_list_in[i]:
if count < Dtime[b]:
count = Dtime[b]
Dtime[i] = D[i] + count
print(Dtime[W])
์ ๋ ฌ๋ ์์์ ๋ฐ๋ผ ๊ฑด๋ฌผ๋ค์ด ์ง์ด์ง๋ ์๊ฐ์ ๊ณ์ฐํ๋ฉด ๋๋ค. node i์ ๋ํด i์ ๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ๋ค ์ค ์ต๋๊ฐ์
D [i]์ ๋ํด์ฃผ๋ฉด ๋๋ค. ์ดํ ๋ฌธ์ ์์ ์๊ตฌํ ๊ฑด๋ฌผ์ ๊ฑด์ค ์๊ฐ์ ์ถ๋ ฅํ๋ค.
์ ์ฒด ์ฝ๋
from collections import deque
import sys
input = sys.stdin.readline
T = int(input().rstrip())
for _ in range(T):
N, K = map(int,input().rstrip().split())
D = [0]
D.extend([int(x) for x in input().rstrip().split()]) # n๋ฒ์งธ ๊ฑด๋ฌผ ๊ฑด์ค ์๊ฐ
in_degree = [0 for _ in range(N + 1)] # n๋ฒ์งธ node ์ง์
์ฐจ์
adj_list_out = [[] for i in range(N + 1)] # n๋ฒ์งธ ๋
ธ๋์์ out์ธ ๋
ธ๋ ์ ์ฅ
adj_list_in = [[] for i in range(N + 1)] # n๋ฒ์งธ ๋
ธ๋์์ in์ธ ๋
ธ๋ ์ ์ฅ
deq = deque()
toposort = []
Dtime = [0 for i in range(N + 1)] # n๋ฒ์งธ ๊ฑด์ค๊น์ง ์์๋๋ ์๊ฐ
for i in range(K):
x, y = map(int,input().rstrip().split())
adj_list_out[x].append(y)
adj_list_in[y].append(x)
in_degree[y] += 1
W = int(input())
for i in range(1,N + 1):
if in_degree[i] == 0:
deq.append(i)
while deq:
node = deq.popleft()
toposort.append(node)
for s in adj_list_out[node]:
in_degree[s] -= 1
if in_degree[s] == 0:
deq.append(s)
for i in toposort:
count = 0
for b in adj_list_in[i]:
if count < Dtime[b]:
count = Dtime[b]
Dtime[i] = D[i] + count
print(Dtime[W])
์ถ๊ฐ)
for i in range(1,N + 1):
if in_degree[i] == 0:
deq.append(i)
Dtime[i] = D[i] #
while deq:
node = deq.popleft()
toposort.append(node)
for s in adj_list_out[node]:
in_degree[s] -= 1
Dtime[s] = max(Dtime[s],Dtime[node] + D[s]) #
if in_degree[s] == 0:
deq.append(s)
while๋ฌธ์์ DP๋ฅผ ์ด์ฉํด ํด๊ฒฐํ๋ฉด ์ข ๋ ํจ์จ์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
ํ๋ฅผ ๋บ ๋๋ง๋ค ์ด์ Dtime๊ฐ์ด๋ ์ด์ ๊ฑด๋ฌผ๊น์ง ๊ฑด์คํ๋ ๋ฐ ๊ฑธ๋ฆฐ ์๊ฐ + ์ด๋ฒ ๊ฑด๋ฌผ ์ง๋ ์๊ฐ์ ๋น๊ตํ์ฌ ํฐ ๊ฐ์ ์ ์ฅํด์ค๋ค.
ํฐ๊ฐ์ ๊ตฌํ๋ ์ด์ ๋ ๊ฑด๋ฌผ์ ์ง๊ธฐ ์ํด์ ์ด์ ๊ฑด๋ฌผ๋ค์ ์ ๋ถ ์ง์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ํฐ ๊ฐ์ ์ ํํ์ฌ ์ ์ฅํ๋ค.
'๐งฉ Problem Solving > [๋ฐฑ์ค]' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 2252 ์ค์ธ์ฐ๊ธฐ (python ํ์ด์ฌ) (0) | 2022.06.11 |
---|---|
[๋ฐฑ์ค] 11718 ๊ทธ๋๋ก ์ถ๋ ฅํ๊ธฐ (python ํ์ด์ฌ) (0) | 2022.06.10 |
[๋ฐฑ์ค] 14499 ์ฃผ์ฌ์ ๊ตด๋ฆฌ๊ธฐ(python ํ์ด์ฌ) (0) | 2022.06.09 |
[๋ฐฑ์ค] 7576 ํ ๋งํ (python ํ์ด์ฌ) (0) | 2022.06.08 |
[๋ฐฑ์ค] 14503 ๋ก๋ด ์ฒญ์๊ธฐ (python ํ์ด์ฌ) (0) | 2022.05.23 |