๋ฌธ์ œ

https://www.acmicpc.net/problem/1516

์ˆŒ ํšŒ์‚ฌ์—์„œ ์ด๋ฒˆ์— ์ƒˆ๋กœ์šด ์ „๋žต ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ฒŒ์ž„ ์„ธ์ค€ ํฌ๋ž˜ํ”„ํŠธ๋ฅผ ๊ฐœ๋ฐœํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค. ํ•ต์‹ฌ์ ์ธ ๋ถ€๋ถ„์€ ๊ฐœ๋ฐœ์ด ๋๋‚œ ์ƒํƒœ๊ณ , ์ข…์กฑ๋ณ„ ๊ท ํ˜•๊ณผ ์ „์ฒด ๊ฒŒ์ž„ ์‹œ๊ฐ„ ๋“ฑ์„ ์กฐ์ ˆํ•˜๋Š” ๋ถ€๋ถ„๋งŒ ๋‚จ์•„ ์žˆ์—ˆ๋‹ค.

๊ฒŒ์ž„ ํ”Œ๋ ˆ์ด์— ๋“ค์–ด๊ฐ€๋Š” ์‹œ๊ฐ„์€ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ชจ๋“  ๊ฑด๋ฌผ์„ ์ง“๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์ตœ์†Œ์˜ ์‹œ๊ฐ„์„ ์ด์šฉํ•˜์—ฌ ๊ทผ์‚ฌํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค. ๋ฌผ๋ก , ์–ด๋–ค ๊ฑด๋ฌผ์„ ์ง“๊ธฐ ์œ„ํ•ด์„œ ๋‹ค๋ฅธ ๊ฑด๋ฌผ์„ ๋จผ์ € ์ง€์–ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋‹จ์ˆœํ•˜์ง€๋งŒ์€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ์Šคํƒ€ํฌ๋ž˜ํ”„ํŠธ์—์„œ ๋ฒ™์ปค๋ฅผ ์ง“๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐฐ๋Ÿญ์„ ๋จผ์ € ์ง€์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐฐ๋Ÿญ์„ ๋จผ์ € ์ง€์€ ๋’ค ๋ฒ™์ปค๋ฅผ ์ง€์–ด์•ผ ํ•œ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฑด๋ฌผ์„ ๋™์‹œ์— ์ง€์„ ์ˆ˜ ์žˆ๋‹ค.

ํŽธ์˜์ƒ ์ž์›์€ ๋ฌดํ•œํžˆ ๋งŽ์ด ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ๊ฑด๋ฌผ์„ ์ง“๋Š” ๋ช…๋ น์„ ๋‚ด๋ฆฌ๊ธฐ๊นŒ์ง€๋Š” ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.


์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๊ฑด๋ฌผ์˜ ์ข…๋ฅ˜ ์ˆ˜ N(1 โ‰ค N โ‰ค 500)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ ๊ฑด๋ฌผ์„ ์ง“๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„๊ณผ ๊ทธ ๊ฑด๋ฌผ์„ ์ง“๊ธฐ ์œ„ํ•ด ๋จผ์ € ์ง€์–ด์ ธ์•ผ ํ•˜๋Š” ๊ฑด๋ฌผ๋“ค์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฑด๋ฌผ์˜ ๋ฒˆํ˜ธ๋Š” 1๋ถ€ํ„ฐ N๊นŒ์ง€๋กœ ํ•˜๊ณ , ๊ฐ ์ค„์€ -1๋กœ ๋๋‚œ๋‹ค๊ณ  ํ•˜์ž. ๊ฐ ๊ฑด๋ฌผ์„ ์ง“๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ 100,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค. ๋ชจ๋“  ๊ฑด๋ฌผ์„ ์ง“๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ์ž…๋ ฅ๋งŒ ์ฃผ์–ด์ง„๋‹ค.


์ถœ๋ ฅ

N๊ฐœ์˜ ๊ฐ ๊ฑด๋ฌผ์ด ์™„์„ฑ๋˜๊ธฐ๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•œ๋‹ค.


๐Ÿ” Algorithm

์œ„์ƒ ์ •๋ ฌ, Dynamic Programming

๐Ÿ’ป Logic

def topology_sort():
    global result
    q = deque()
    for i in range(1, N+1):
        if indegree[i] == 0:
            q.append(i)
    while q:
        num = q.popleft()
        result[num] += time[num]
        for i in graph[num]:
            # ๋จผ์ € ์ง€์–ด์ ธ์•ผ ํ•˜๋Š” ๊ฑด๋ฌผ๋“ค์ด ๋™์‹œ์— ์ง€์–ด์ง€๋Š” ๊ฒฝ์šฐ ๊ณ ๋ ค
            result[i] = max(result[i], result[num])
            indegree[i] -= 1
            if indegree[i] == 0:
                q.append(i)
  • ์œ„์ƒ ์ •๋ ฌ ํ•จ์ˆ˜
    • ์ง„์ž… ์ฐจ์ˆ˜(indegree) 0์ด๋ฉด deque์— append
    • deque์—์„œ popleftํ•˜๊ณ  result๊ฐ’ ๋ณ€๊ฒฝ, ์—ฐ๊ฒฐ๋œ ๊ฐ„์„  ์ œ๊ฑฐ(์ง„์ž…์ฐจ์ˆ˜ -1)
    • result๊ฐ’์€ ๋จผ์ € ์ง€์–ด์ ธ์•ผ ํ•˜๋Š” ๊ฑด๋ฌผ๋“ค์ด ๋™์‹œ์— ์ง€์–ด์ง€๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•˜๊ธฐ ์œ„ํ•ด
      result[i] ์™€ result[num] ์ค‘ max ๊ฐ’์„ result[i] ์— ์ €์žฅ

N = int(sys.stdin.readline())
graph = [[] for _ in range(N+1)]
indegree = [0 for _ in range(N+1)]
time = [0 for _ in range(N+1)]
result = [0 for _ in range(N+1)]
for i in range(1, N+1):
    temp = [int(x) for x in sys.stdin.readline().split()]
    time[i] = temp[0]
    for j in range(1, len(temp)):
        if temp[j] == -1: break
        graph[temp[j]].append(i)
        indegree[i] += 1
     
topology_sort()
for i in range(1, N+1):
    print(result[i])
  • ๊ทธ๋ž˜ํ”„ ์ •๋ณด ์ €์žฅ ํ›„, topology_sort ํ•จ์ˆ˜ ์‹คํ–‰

๐Ÿงฉ Code

์ „์ฒด ์ฝ”๋“œ ํ™•์ธ
import sys
from collections import deque

def topology_sort():
    global result
    q = deque()
    for i in range(1, N+1):
        if indegree[i] == 0:
            q.append(i)
    while q:
        num = q.popleft()
        result[num] += time[num]
        for i in graph[num]:
            # ๋จผ์ € ์ง€์–ด์ ธ์•ผ ํ•˜๋Š” ๊ฑด๋ฌผ๋“ค์ด ๋™์‹œ์— ์ง€์–ด์ง€๋Š” ๊ฒฝ์šฐ ๊ณ ๋ ค
            result[i] = max(result[i], result[num])
            indegree[i] -= 1
            if indegree[i] == 0:
                q.append(i)

N = int(sys.stdin.readline())
graph = [[] for _ in range(N+1)]
indegree = [0 for _ in range(N+1)]
time = [0 for _ in range(N+1)]
result = [0 for _ in range(N+1)]
for i in range(1, N+1):
    temp = [int(x) for x in sys.stdin.readline().split()]
    time[i] = temp[0]
    for j in range(1, len(temp)):
        if temp[j] == -1: break
        graph[temp[j]].append(i)
        indegree[i] += 1
     
topology_sort()
for i in range(1, N+1):
    print(result[i])

๐Ÿ“ Review

์ฒ˜์Œ์—๋Š” ๊ทธ๋ƒฅ ์œ„์ƒ์ •๋ ฌ ๋ฌธ์ œ ํ’€ ๋“ฏ์ด ํ’€๋ฉด ๋˜๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์ ‘๊ทผํ•ด์„œ ํ’€์—ˆ๋Š”๋ฐ "์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฑด๋ฌผ์„ ๋™์‹œ์— ์ง€์„ ์ˆ˜ ์žˆ๋‹ค." ์ด ๋ถ€๋ถ„์„ ์ƒ๊ฐ ๋ชปํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.
์ € ๋ฌธ์žฅ์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ๋ฐ”๋กœ ํŒŒ์•…ํ•˜์ง€ ๋ชปํ–ˆ๊ณ , ๊ทธ๋ž˜์„œ ์ด ๋ถ€๋ถ„์„ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์—ˆ๋‹ค.