We will find a way, we always have.

-interstellar

Problem Solving/๋ฐฑ์ค€

[๋ฐฑ์ค€] 14567๋ฒˆ: ์„ ์ˆ˜๊ณผ๋ชฉ (Prerequisite) - ํŒŒ์ด์ฌ

Redddy 2022. 9. 18. 22:28

๐Ÿ”ˆ ๋ฌธ์ œ

์˜ฌํ•ด Z๋Œ€ํ•™ ์ปดํ“จํ„ฐ๊ณตํ•™๋ถ€์— ์ƒˆ๋กœ ์ž…ํ•™ํ•œ ๋ฏผ์šฑ์ด๋Š” ํ•™๋ถ€์— ๊ฐœ์„ค๋œ ๋ชจ๋“  ์ „๊ณต๊ณผ๋ชฉ์„ ๋“ฃ๊ณ  ์กธ์—…ํ•˜๋ ค๋Š” ์›๋Œ€ํ•œ ๋ชฉํ‘œ๋ฅผ ์„ธ์› ๋‹ค. ์–ด๋–ค ๊ณผ๋ชฉ๋“ค์€ ์„ ์ˆ˜๊ณผ๋ชฉ์ด ์žˆ์–ด ํ•ด๋‹น๋˜๋Š” ๋ชจ๋“  ๊ณผ๋ชฉ์„ ๋จผ์ € ์ด์ˆ˜ํ•ด์•ผ๋งŒ ํ•ด๋‹น ๊ณผ๋ชฉ์„ ์ด์ˆ˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด ์žˆ๋‹ค. ๊ณตํ•™์ธ์ฆ์„ ํฌ๊ธฐํ•  ์ˆ˜ ์—†๋Š” ๋ถˆ์Œํ•œ ๋ฏผ์šฑ์ด๋Š” ์„ ์ˆ˜๊ณผ๋ชฉ ์กฐ๊ฑด์„ ๋ฐ˜๋“œ์‹œ ์ง€์ผœ์•ผ๋งŒ ํ•œ๋‹ค. ๋ฏผ์šฑ์ด๋Š” ์„ ์ˆ˜๊ณผ๋ชฉ ์กฐ๊ฑด์„ ์ง€ํ‚ฌ ๊ฒฝ์šฐ ๊ฐ๊ฐ์˜ ์ „๊ณต๊ณผ๋ชฉ์„ ์–ธ์ œ ์ด์ˆ˜ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ด์กŒ๋‹ค. ๊ณ„์‚ฐ์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด ์กฐ๊ฑด์„ ๊ฐ„์†Œํ™”ํ•˜์—ฌ ๊ณ„์‚ฐํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค.

  - ํ•œ ํ•™๊ธฐ์— ๋“ค์„ ์ˆ˜ ์žˆ๋Š” ๊ณผ๋ชฉ ์ˆ˜์—๋Š” ์ œํ•œ์ด ์—†๋‹ค.
  - ๋ชจ๋“  ๊ณผ๋ชฉ์€ ๋งค ํ•™๊ธฐ ํ•ญ์ƒ ๊ฐœ์„ค๋œ๋‹ค.

๋ชจ๋“  ๊ณผ๋ชฉ์— ๋Œ€ํ•ด ๊ฐ ๊ณผ๋ชฉ์„ ์ด์ˆ˜ํ•˜๋ ค๋ฉด ์ตœ์†Œ ๋ช‡ ํ•™๊ธฐ๊ฐ€ ๊ฑธ๋ฆฌ๋Š”์ง€ ๊ณ„์‚ฐํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์—ฌ๋ผ.

 

๐Ÿ“์ž…๋ ฅ

์ฒซ ๋ฒˆ์งธ ์ค„์— ๊ณผ๋ชฉ์˜ ์ˆ˜ N(1 ≤ N ≤ 1000)๊ณผ ์„ ์ˆ˜ ์กฐ๊ฑด์˜ ์ˆ˜ M(0 ≤ M ≤ 500000)์ด ์ฃผ์–ด์ง„๋‹ค. ์„ ์ˆ˜๊ณผ๋ชฉ ์กฐ๊ฑด์€ M๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ ํ•œ ์ค„์— ์ •์ˆ˜ A B ํ˜•ํƒœ๋กœ ์ฃผ์–ด์ง„๋‹ค. A๋ฒˆ ๊ณผ๋ชฉ์ด B๋ฒˆ ๊ณผ๋ชฉ์˜ ์„ ์ˆ˜๊ณผ๋ชฉ์ด๋‹ค. A < B์ธ ์ž…๋ ฅ๋งŒ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ A < B ≤ N)

 

๐Ÿ“‘์ถœ๋ ฅ

1๋ฒˆ ๊ณผ๋ชฉ๋ถ€ํ„ฐ N๋ฒˆ ๊ณผ๋ชฉ๊นŒ์ง€ ์ฐจ๋ก€๋Œ€๋กœ ์ตœ์†Œ ๋ช‡ ํ•™๊ธฐ์— ์ด์ˆ˜ํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ํ•œ ์ค„์— ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ถœ๋ ฅํ•œ๋‹ค.

 

๐Ÿ“š ๋ฌธ์ œ ํ’€์ด

์„ ์ˆ˜ ๊ณผ๋ชฉ์ด๋ž€ ํ•ด๋‹น ๊ณผ๋ชฉ์„ ๋“ฃ๊ธฐ ์ด์ „์— ๋“ค์–ด์•ผ ํ•˜๋Š” ๊ณผ๋ชฉ์ด๋‹ค.

์œ„์ƒ ์ •๋ ฌ(Topology sort)์„ ์‚ฌ์šฉํ•˜์—ฌ ํ’€์—ˆ๋‹ค. ์œ„์ƒ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์จํด์ด ์—†๋Š” ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์—์„œ์˜ ํƒ์ƒ‰ ์ˆœ์„œ๋ฅผ ํŒŒ์•…ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. pre ๋ผ๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด์„œ ๊ฐ ๋…ธ๋“œ๋งˆ๋‹ค ํ•ด๋‹น ๋…ธ๋“œ๋กœ ๋“ค์–ด์˜ค๋Š” ๊ฐ„์„ ์˜ ๊ฐฏ์ˆ˜๋ฅผ ์นด์šดํŠธํ•˜๊ณ (A->B ๋ผ๋ฉด B์— +1) ์ €์žฅํ•œ๋‹ค.

pre ์˜ ๊ฐ’์ด 0์ด๋ฉด ํ•ด๋‹น ๋…ธ๋“œ๋กœ ๋“ค์–ด์˜ค๋Š” ๊ฐ„์„ ์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์ดˆ๊ธฐ์˜ pre ๊ฐ’์ด 0์ธ ๋…ธ๋“œ๋Š” ์„ ์ˆ˜๊ณผ๋ชฉ์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ๋œปํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๋…ธ๋“œ๋ฅผ ํ์— ์‚ฝ์ž…ํ•œ๋‹ค. BFS ๋Œ ๋•Œ ์ฒ˜๋Ÿผ ์—ฐ๊ฒฐ๋œ ๊ฐ„์„ ์„ ํƒ์ƒ‰ํ•˜๊ณ  ๊ทธ ๊ฐ„์„ ๊ณผ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ์˜ pre ๊ฐ’์„ -1 ํ•œ๋‹ค. ์ด์ œ pre ๊ฐ’์ด 0์ด๋ผ๋ฉด ์„ ์ˆ˜๊ณผ๋ชฉ์„ ๋‹ค ๋“ค์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๊ธฐ์— ํ์— ์‚ฝ์ž…ํ•œ๋‹ค.

 

 

๐Ÿ’ป ์ฝ”๋“œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from collections import deque
 
n,m = map(int,input().split())
table = [[] for _ in range(n+1)]
res = [0]*(n+1)
pre = [0]*(n+1)
for _ in range(m):
    a,b = map(int,input().split())
    table[a].append(b)
    pre[b] += 1
 
queue = deque()
for i in range(1, n+1):
    if pre[i]==0:
        queue.append([i,1])
 
while queue:
    node,cnt = queue.popleft()
    res[node] = cnt
    for i in table[node]:
        pre[i] -= 1
        if pre[i] == 0:
            queue.append([i,cnt+1])
print(*res[1:])
cs

 

๐Ÿ”— ๋ฌธ์ œ๋งํฌ ์„ ์ˆ˜๊ณผ๋ชฉ

 

14567๋ฒˆ: ์„ ์ˆ˜๊ณผ๋ชฉ (Prerequisite)

3๊ฐœ์˜ ๊ณผ๋ชฉ์ด ์žˆ๊ณ , 2๋ฒˆ ๊ณผ๋ชฉ์„ ์ด์ˆ˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 1๋ฒˆ ๊ณผ๋ชฉ์„ ์ด์ˆ˜ํ•ด์•ผ ํ•˜๊ณ , 3๋ฒˆ ๊ณผ๋ชฉ์„ ์ด์ˆ˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 2๋ฒˆ ๊ณผ๋ชฉ์„ ์ด์ˆ˜ํ•ด์•ผ ํ•œ๋‹ค.

www.acmicpc.net