๐Ÿงฉ Problem Solving/[๋ฐฑ์ค€]

[๋ฐฑ์ค€] 2252 ์ค„์„ธ์šฐ๊ธฐ (python ํŒŒ์ด์ฌ)

์ œ๋ด‰์•„ 2022. 6. 11. 02:32

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

 

2252๋ฒˆ: ์ค„ ์„ธ์šฐ๊ธฐ

์ฒซ์งธ ์ค„์— N(1 ≤ N ≤ 32,000), M(1 ≤ M ≤ 100,000)์ด ์ฃผ์–ด์ง„๋‹ค. M์€ ํ‚ค๋ฅผ ๋น„๊ตํ•œ ํšŒ์ˆ˜์ด๋‹ค. ๋‹ค์Œ M๊ฐœ์˜ ์ค„์—๋Š” ํ‚ค๋ฅผ ๋น„๊ตํ•œ ๋‘ ํ•™์ƒ์˜ ๋ฒˆํ˜ธ A, B๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ด๋Š” ํ•™์ƒ A๊ฐ€ ํ•™์ƒ B์˜ ์•ž์— ์„œ์•ผ ํ•œ๋‹ค๋Š” ์˜

www.acmicpc.net

 

ํ’€์ด ๊ณผ์ •

์ž…๋ ฅ๊ฐ’์€ ํ‚ค๋ฅผ ๋น„๊ตํ•œ ํ•™์ƒ A์™€ B์˜ ์ˆœ์„œ๊ฐ€ M๊ฐœ๋งŒํผ ์ฃผ์–ด์ง„๋‹ค. 

๋ฐ”๋กœ ์ด์ „์— ํ’€์—ˆ๋˜ ACMCraft์™€ ๋น„์Šทํ•œ ์œ ํ˜•์ธ ๊ฑฐ ๊ฐ™์•„ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ–ˆ๋‹ค.

์œ„์ƒ ์ •๋ ฌ๋งŒ ์•Œ๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•˜๋‹ค.

from collections import deque
import sys
input = sys.stdin.readline
N, M = map(int,input().rstrip().split())

student_adj_list = [[] for _ in range(N + 1)]
in_degree = [0 for _ in range(N + 1)]
que = deque()

for i in range(M):
    x, y = map(int,input().rstrip().split())
    student_adj_list[x].append(y)
    in_degree[y] += 1

์ •์ ์— ๋“ค์–ด์˜ค๋Š” ๊ฐ„์„ ์ˆ˜๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด in_degree๋ฆฌ์ŠคํŠธ์™€ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ student_adj_list๋ฅผ ์„ ์–ธํ•œ๋‹ค.

์ดํ›„ ๋“ค์–ด์˜ค๋Š” M๊ฐœ์˜ ์ž…๋ ฅ๊ฐ’์„ ์ €์žฅํ•˜๋ฉด ์ค€๋น„ ๋

 

for i in range(1,N + 1):
    if in_degree[i] == 0:
        que.append(i)

while que:
    node = que.popleft()
    print(node,end=' ')
    for student in student_adj_list[node]:
        in_degree[student] -= 1
        if in_degree[student] == 0:
            que.append(student)
print()

๊ฐ€์žฅ ์ดˆ๊ธฐ ์ƒํƒœ์— ์ •์ ์— ๋“ค์–ด์˜ค๋Š” ๊ฐ„์„ ์ˆ˜(in_degree) ๊ฐ’์ด 0์ธ ๊ฒƒ๋“ค์„ ํ์— ๋„ฃ์–ด์ค€๋‹ค.

ํ•ด๋‹น ์ •์ ๊ณผ ์—ฐ๊ฒฐ๋œ ์ •์ ๋“ค์˜ in_degree๊ฐ’๋“ค์„ 1์”ฉ ๊ฐ์†Œ์‹œ์ผœ์ค€๋‹ค.

๊ฐ’์ด 0์ด ๋œ ์ •์ ์€ ํ์— ๋„ฃ์–ด์ค€๋‹ค. ํ๊ฐ€ ๋น„์›Œ์งˆ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋ฉด ๋œ๋‹ค.

 

์ „์ฒด ์ฝ”๋“œ

from collections import deque
import sys
input = sys.stdin.readline
N, M = map(int,input().rstrip().split())

student_adj_list = [[] for _ in range(N + 1)]
in_degree = [0 for _ in range(N + 1)]
que = deque()

for i in range(M):
    x, y = map(int,input().rstrip().split())
    student_adj_list[x].append(y)
    in_degree[y] += 1

for i in range(1,N + 1):
    if in_degree[i] == 0:
        que.append(i)

while que:
    node = que.popleft()
    print(node,end=' ')
    for student in student_adj_list[node]:
        in_degree[student] -= 1
        if in_degree[student] == 0:
            que.append(student)
print()