๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โญ Problem_Solving/๋ฐฑ์ค€

[๋ฐฑ์ค€] 1766 ๋ฌธ์ œ์ง‘ (Python/ํŒŒ์ด์ฌ)

by ํฌ์ŠคํŠธ์‰์ดํฌ 2022. 10. 6.

<๋ฌธ์ œ ๋งํฌ>

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

 

1766๋ฒˆ: ๋ฌธ์ œ์ง‘

์ฒซ์งธ ์ค„์— ๋ฌธ์ œ์˜ ์ˆ˜ N(1 ≤ N ≤ 32,000)๊ณผ ๋จผ์ € ํ‘ธ๋Š” ๊ฒƒ์ด ์ข‹์€ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ •๋ณด์˜ ๊ฐœ์ˆ˜ M(1 ≤ M ≤ 100,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ M๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ ๋‘ ์ •์ˆ˜์˜ ์ˆœ์„œ์Œ A,B๊ฐ€ ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ

www.acmicpc.net

<ํ’€์ด ์ „๋žต>

1. ์šฐ์„ ์ˆœ์œ„ํ๋กœ ์œ„์ƒ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

2. ๋ฌธ์ œ์˜ ์กฐ๊ฑด์„ ์ฝ์–ด๋ณด๋ฉด ๋น„๊ต์  ๋ช…ํ™•ํ•˜๋‹ค.

- ๋จผ์ € ํ‘ธ๋Š” ๊ฒƒ์ด ์ข‹์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๋ฌธ์ œ๋Š”, ๋จผ์ € ํ‘ธ๋Š” ๊ฒƒ์ด ์ข‹์€ ๋ฌธ์ œ๋ฅผ ๋ฐ˜๋“œ์‹œ ๋จผ์ € ํ’€์–ด์•ผ ํ•œ๋‹ค. ->  ์œ„์ƒ์ •๋ ฌ

- ๊ฐ€๋Šฅํ•˜๋ฉด ์‰ฌ์šด ๋ฌธ์ œ๋ถ€ํ„ฐ ํ’€์–ด์•ผ ํ•œ๋‹ค. -> ์šฐ์„ ์ˆœ์œ„ ํ

3. ์œ„์ƒ์ •๋ ฌ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ํ‘ผ ๋ฌธ์ œ์˜€๋Š”๋ฐ ์œ„์ƒ์ •๋ ฌ์ž„์„ ์•Œ๊ณ  ํ’€์–ด์„œ ๊ทธ๋Ÿฐ์ง€ ๋ชฐ๋ผ๋„ ๋‚œ์ด๋„์— ๋น„ํ•ด์„œ ์‰ฌ์› ๋‹ค.

 

<์ •๋‹ต ์ฝ”๋“œ>

import heapq
import sys, os, io, atexit

input = lambda: sys.stdin.readline().rstrip('\r\n')
stdout = io.BytesIO()
sys.stdout.write = lambda s: stdout.write(s.encode("ascii"))
atexit.register(lambda: os.write(1, stdout.getvalue()))

# 221003 1766 ๋ฌธ์ œ์ง‘

# ์ •๋‹ต์ฝ”๋“œ

# N: ๋ฌธ์ œ์˜ ์ˆ˜, M: ์ •๋ณด์˜ ์ˆ˜
N, M = map(int, input().split())

# indegree: ์ง„์ž…์ฐจ์ˆ˜, graph: ๊ทธ๋ž˜ํ”„๋กœ ๋‚˜ํƒ€๋‚ธ ๋ฌธ์ œ๋“ค์˜ ์„ ํ›„ ๊ด€๊ณ„
indegree = [0 for _ in range(N + 1)]
graph = [[] for _ in range(N + 1)]
for _ in range(M):
    node1, node2 = map(int, input().split())
    graph[node1].append(node2)
    indegree[node2] += 1

# reuslt: ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์„ ๋ฆฌ์ŠคํŠธ, queue: ์œ„์ƒ์ •๋ ฌ ์‹œ ์‚ฌ์šฉํ•  ๋ฐฐ์—ด(์šฐ์„ ์ˆœ์œ„ํ)
result = []
queue = []

# ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ธ ๋ฌธ์ œ๋“ค์„ ์šฐ์„ ์ˆœ์œ„ํ์— ๋„ฃ์–ด์ค€๋‹ค.
for i in range(1, N + 1):
    if indegree[i] == 0:
        heapq.heappush(queue, i)

# ์šฐ์„ ์ˆœ์œ„ํ(์‰ฌ์šด๋ฌธ์ œ ์šฐ์„ )๋ฅผ ์ด์šฉํ•˜์—ฌ ์œ„์ƒ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
while queue:
    current = heapq.heappop(queue)
    result.append(current)

    for next in graph[current]:
        indegree[next] -= 1
        if indegree[next] == 0:
            heapq.heappush(queue, next)

# ๊ฒฐ๊ณผ ์ถœ๋ ฅ
print(*result)

๋Œ“๊ธ€