만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

압축된 생성 부분트리

시간 제한2초메모리 제한256 MB

요약
차수가 2인 정점이 없는 숨겨진 트리를, 고른 집합의 압축 생성 부분트리 정점 수를 질의하여 복원합니다.
난이도

어려움10점 중 9점

유형
트리, 분할 정복, 구현
정답자
아직 제출이 없습니다

문제

정점 nn개로 이루어진 트리 TT가 있으며, 정점 번호는 1부터 nn까지이다. 정점 집합 XX에 속한 정점을 생성된 정점(spanned)이라 하고, XX에 속하지 않은 정점을 생성되지 않은 정점(not spanned)이라 한다. 압축 생성 부분트리 S(X)S(X)는 다음 알고리즘으로 구한다.

  1. S(X)←TS(X) \leftarrow T로 둔다.
  2. 생성되지 않은 정점 중 연결된 간선이 정확히 하나인 정점이 있으면, 그 정점을 간선과 함께 제거한다.
  3. 2번의 조건이 계속 성립하면 2번을 반복한다.
  4. 생성되지 않은 정점 중 연결된 간선이 정확히 두 개인 정점이 있으면, 그 정점과 두 간선을 제거하고 남은 두 끝점을 잇는 새 간선을 추가한다.
  5. 4번의 조건이 계속 성립하면 4번을 반복한다.

형식적으로, S(X)S(X)는 XX의 모든 정점을 포함하는 TT의 가장 작은 부분 그래프이며, 나머지 차수가 2 이하인 정점은 펴서 없앤 그래프이다.

테스트 1의 트리와 X={3,4,6}X = \{3, 4, 6\}, X={2,5,6}X = \{2, 5, 6\}일 때의 압축 생성 부분트리이다.

트리 TT는 주어지지 않는다. 대신 TT를 찾아야 한다. 다음 형태의 질문을 할 수 있다: "XX의 압축 생성 부분트리는 정점을 몇 개 포함하는가?" 이 질문만으로는 트리를 찾을 수 없으므로, TT에는 연결된 간선이 정확히 두 개인 정점이 없다.

예제1

  1. 예제 1

    입력
    6
    
    3
    
    4
    
    4
    
    
    예상 출력
    
    ? 3 4 3 6
    
    ? 4 1 2 3 6
    
    ? 3 2 5 6
    
    ! 1 2 2 3 3