ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

728x90
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

 

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

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

www.acmicpc.net

 

๋ฌธ์ œ ํ’€์ด

 ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด์„œ๋Š” ์œ„์ƒ ์ •๋ ฌ์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์ด์— ๋Œ€ํ•œ ๊ฐœ๋…์„ ์ดํ•ดํ•˜์˜€๋‹ค๋ฉด ์œ„์ƒ ์ •๋ ฌ์„ ๊ทธ๋Œ€๋กœ ๊ตฌํ˜„ํ•œ ํ›„, ๋‹ค์Œ ์กฐ๊ฑด์„ ์ดํ•ดํ•˜๋ฉด ์‰ฝ๊ฒŒ ๋‹ต์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

 

์˜ˆ์ œ ์ž…๋ ฅ2๋ฅผ ๊ทธ๋ž˜ํ”„๋กœ ํ‘œ๊ธฐ

  • ์œ„์ƒ ์ •๋ ฌ์„ ์ด์šฉํ•˜๋ฉด ํƒ์ƒ‰ ์ˆœ์„œ๋Š” 1, 4, 6, 2, 3, 5์ด๋‹ค.
  • 1, 4, 6 ๊ณผ๋ชฉ์€ ์„ ์ˆ˜ ๊ณผ๋ชฉ(์ง„์ž… ์ฐจ์ˆ˜๊ฐ€ 0)์ด ์—†๋‹ค.
    • ์„ ์ˆ˜ ๊ณผ๋ชฉ์ด ์—†๋Š” ๊ฒฝ์šฐ์ด๋ฏ€๋กœ 1ํ•™๊ธฐ์— ์ˆ˜๊ฐ•ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • 2, 3์˜ ๊ฒฝ์šฐ ์ง„์ž… ์ฐจ์ˆ˜๊ฐ€ 1์ด๊ณ , ์„ ์ˆ˜ ๊ณผ๋ชฉ์€ 1์ด๋‹ค.
    • ์„ ์ˆ˜ ๊ณผ๋ชฉ์ด ์žˆ์œผ๋ฏ€๋กœ 1๋ฒˆ ๊ณผ๋ชฉ์„ ์ˆ˜๊ฐ•ํ•œ ์ดํ›„์— ์ˆ˜๊ฐ•ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • 5๋ฒˆ ๊ฐ•์˜๋Š” ์„ ์ˆ˜ ๊ณผ๋ชฉ์ด 2, 4 ์ด๋ฏ€๋กœ 2๊ฐœ ๋ชจ๋‘ ์ˆ˜๊ฐ•ํ•˜์—ฌ์•ผ ์ˆ˜๊ฐ•ํ•  ์ˆ˜ ์žˆ๋‹ค.

 ์„ ์ˆ˜ ๊ณผ๋ชฉ์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ๋Š” queue๋ฅผ ํ†ตํ•ด ์ง„์ž… ์ฐจ์ˆ˜๋ฅผ ๊ฐ์†Œํ•˜๋Š” ๊ณผ์ •์—์„œ ์„ ์ˆ˜ ๊ณผ๋ชฉ์˜ ์ˆ˜๊ฐ• ํ•™๊ธฐ๋ฅผ ๊ณ ๋ คํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜์˜ํ•˜์—ฌ์•ผ ํ•œ๋‹ค. ์ด๋Š” `ํ˜„์žฌ ์ˆ˜๊ฐ• ๊ณผ๋ชฉ์˜ ํ•™๊ธฐ = ์„ ์ˆ˜ ์ˆ˜๊ฐ• ๊ณผ๋ชฉ์˜ ํ•™๊ธฐ + 1`์ด ๋œ๋‹ค. ์ด๋Š” ์œ„์ƒ ์ •๋ ฌ์„ ํ†ตํ•ด, ์„ ์ˆ˜ ๊ณผ๋ชฉ(์ง„์ž… ์ฐจ์ˆ˜)์ด ๋งŽ์€ ๊ณผ๋ชฉ(๋…ธ๋“œ)์€ ์ฐจํ›„์— ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 ์ฆ‰, 2, 3 ๊ณผ๋ชฉ์˜ ๊ฒฝ์šฐ 1 ๊ณผ๋ชฉ์ดํ›„์— ์ˆ˜๊ฐ•ํ•˜์—ฌ์•ผ ํ•˜๋ฏ€๋กœ 2ํ•™๊ธฐ์— ์ˆ˜๊ฐ•ํ•  ์ˆ˜ ์žˆ๋‹ค. 5 ๊ณผ๋ชฉ์˜ ๊ฒฝ์šฐ 4 ๊ณผ๋ชฉ ์ดํ›„์— ์ˆ˜๊ฐ•ํ•˜๋Š” ์กฐ๊ฑด์ด๋ผ๋ฉด 2๊ฐ€ ๋˜๊ฒ ์ง€๋งŒ 2 ๊ณผ๋ชฉ ์ดํ›„์˜ ์ˆ˜๊ฐ•์ด๋ผ๋Š” ์กฐ๊ฑด๋„ ์žˆ์œผ๋ฏ€๋กœ 2 + 1์ด ๋˜์–ด 3ํ•™๊ธฐ์— ์ˆ˜๊ฐ•ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฅผ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋ฌธ์ œ์—์„œ ์ฐพ๊ณ ์ž ํ•˜๋Š” ๋‹ต์ธ `1 2 2 1 3 1`์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ฝ”๋“œ

from sys import stdin
from collections import deque

PRE, IN_DEGREE = 0, 1

if __name__ == "__main__":
    N, M = map(int, stdin.readline().split())
    # ์ธ๋ฑ์Šค๋ฅผ 1๋ฒˆ ๋ถ€ํ„ฐ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด + 1
    result = [1] * (N + 1)
    subject = [[set(), 0] for _ in range(N + 1)]

    # ํ•˜์œ„ ๊ณผ๋ชฉ๋“ค๊ณผ ์ง„์ž… ์ฐจ์ˆ˜ ์ฆ๊ฐ€
    for _ in range(M):
        A, B = map(int, stdin.readline().split())
        subject[A][PRE].add(B)
        subject[B][IN_DEGREE] += 1

    q = deque()

    for idx, values in enumerate(subject):
        if not idx:
            continue

        prerequisite, in_degree = values
        # ์ตœ์ดˆ ์ง„์ž… ์ฐจ์ˆ˜๊ฐ€ 0 ์ธ ๊ฒฝ์šฐ, queue์— ์‚ฝ์ž…
        if in_degree == 0:
            q.append(idx)

    while q:
        cur_subject = q.popleft()
        prerequisites = subject[cur_subject][PRE]

        for pre in prerequisites:
            subject[pre][IN_DEGREE] -= 1

            # ์ง„์ž… ์ฐจ์ˆ˜๊ฐ€ 0์ด๋ผ๋ฉด, queue์— ์‚ฝ์ž… ํ›„ ํ•™๊ธฐ ์ˆ˜ ํŒŒ์•…
            if subject[pre][IN_DEGREE] == 0:
                q.append(pre)
                result[pre] = result[cur_subject] + 1

    print(*result[1:])

 

728x90
๋ฐ˜์‘ํ˜•
๋Œ“๊ธ€
๊ธ€ ๋ณด๊ด€ํ•จ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€