1889 선물 교환

정민용·2024년 4월 13일

백준

목록 보기
285/286

풀이

  • 위상정렬에서 정렬보다 전입차수 (Indegree)에 초점을 둔 풀이
  • 어느 한 학생이 2개를 초과한 선물을 받는다 라는 것은 다른 한 학생은 선물을 1개 이하로 받는다 로 해석이 가능하다
1. 선물을 1개 이하 (Indegree < 2) 인 학생은 이벤트에서 제외한다.
2. 이벤트에서 제외된 학생에게 선물을 받을 예정이었던 두 학생의 선물 감소 (Indegree --)
3. 이벤트에 참여하는 학생이 모두 선물을 2개만 받을 때까지 1-2 과정을 반복한다.
import sys
from collections import deque

n = int(sys.stdin.readline().rstrip())
graph = [[] for _ in range(n + 1)]
indegree = [0] * (n + 1)
student = set([i for i in range(1, n + 1)])

for i in range(1, n + 1):
    a, b = map(int, sys.stdin.readline().split())
    graph[i].append(a)
    graph[i].append(b)

    indegree[a] += 1
    indegree[b] += 1

queue = deque()
for i in range(1, n + 1):
    if indegree[i] < 2:
        queue.append(i)

while queue:
    s = queue.popleft()
    if s in student:
        student.remove(s)
    else:
        continue

    for g in graph[s]:
        indegree[g] -= 1
        if indegree[g] < 2:
            queue.append(g)

sys.stdout.write(str(len(student)) + '\n')
print(*list(student))

1889 선물교환

0개의 댓글