마법사 루루와 마법의 숲

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

요약
숲의 각 트리마다 특별한 간선이 하나씩 주어질 때, N+1개 정점의 트리를 만들어 숲을 부호화하고, 다시 그 트리에서 원래 숲을 복원하는 두 단계 문제이다.
난이도

어려움10점 중 9점

유형
트리, 그래프, DFS, 구현
정답자
아직 제출이 없습니다

문제

이 문제는 투 스텝 문제이다.

성재와 오필은 마법사 루루의 음모에 빠져들어 성에 갇히게 되었다!

"너희들의 팀워크를 시험해 보도록 하지."

루루는 11번부터 NN번까지 번호가 붙어 있는 NN개의 정점과 MM개의 트리로 이루어진 숲(forest) 하나를 갖고 있다. 이 숲을 '숲 FF'라고 하자. 숲은 11개 이상의 연결 요소로 이루어져 있으며, 각각의 연결 요소가 트리(tree)인 그래프이다.

루루의 숲 FF는 다음과 같은 성질을 가지고 있다.

  • 숲 FF를 이루는 각 트리는 11개 이상의 간선을 가진다.
  • 숲 FF를 이루는 각 트리의 간선 중 정확히 하나는 특별한 간선이다.

루루는 이 숲 FF를 이용하여 성재와 오필에게 과제를 하나 내주고, 이들이 과제를 해결한다면 풀어주기로 약속했다. 루루는 성재와 오필이 서로 소통할 수 없도록 독방에 가두어 놓고, 다음과 같은 과정을 거치게 한다.

  1. 루루는 자신이 가진 숲 FF를 두 개로 복제하여, 복제본 하나는 성재에게 주고, 나머지 하나는 자신이 가진다.
  2. 성재는 루루에게 받은 숲 FF를 참고하여 11번부터 N+1N+1번까지 번호가 붙은 N+1N+1개의 정점을 가진 트리 TT를 구성하여 루루에게 준다.
  3. 루루는 길이 N+1N+1의 순열 A=\[A_1,⋯ ,A_N,A_N+1]A = \[A\_1, \cdots, A\_N, A\_{N+1}]를 정한다. 이때, A_N+1=N+1A\_{N+1} = N+1을 만족한다.
  4. 루루는 자신이 가진 숲 FF와 성재가 만든 트리 TT의 정점 번호를 순열 AA를 이용하여 바꿔 새로운 숲 F′F'과 새로운 트리 T′T'를 만든다. 구체적으로는, 숲 FF에서 ii번 정점과 jj번 정점을 연결하는 간선이 존재한다면, 숲 F′F'에 A_iA\_i번 정점과 A_jA\_j번 정점을 연결하는 간선을 추가한다. 만약 숲 FF에서 ii번 정점과 jj번 정점을 연결하는 간선이 특별한 간선이라면, 숲 F′F'에서 A_iA\_i번 정점과 A_jA\_j번 정점을 연결하는 간선 역시 특별한 간선이 된다. 같은 방법으로 트리 TT를 이용하여 트리 T′T'를 만든다.
  5. 루루는 트리 T′T'를 오필에게 준다. 오필은 트리 T′T'를 보고 루루가 가지고 있는 숲 F′F'를 알아맞혀야 한다. 구체적으로는, 오필은 11번부터 NN번까지 번호가 붙어 있는 NN개의 정점과 MM개의 트리로 이루어져 있으며, 숲을 이루는 각 트리에서 정확히 하나의 간선이 특별한 간선인 숲을 만든다.

오필이 만든 숲이 루루가 가지고 있는 숲 F′F'과 일치한다면, 성재와 오필은 루루의 과제를 해결한 것이다. 만약 그렇지 않다면, 둘은 루루의 과제를 해내지 못한 것이다. 루루가 숲 FF와 순열 AA를 어떻게 선택하더라도 주어진 과제를 항상 해결할 수 있다.

만약 성재와 오필이 이 과제를 해내지 못한다면 둘은 영원히 루루의 성에 갇히게 될 것이다! 과연 성재와 오필은 루루의 성에서 탈출할 수 있을까? 당신이 성재와 오필을 도와주도록 하자!

입력

당신의 프로그램은 채점 데이터 하나당 총 두 번 실행된다. 당신은 하나의 소스코드에 두 가지 실행 과정을 모두 구현해야 한다.

첫째 줄에 실행의 번호를 나타내는 정수 RR이 주어진다. (1≤R≤2)(1 \leq R \leq 2)

R=1R=1일 때 당신은 성재의 역할을 맡아서, 숲 FF를 받아서 트리 TT를 출력해야 한다.

둘째 줄에 숲 FF의 정점의 개수를 의미하는 정수 NN과, 숲에 존재하는 트리의 개수를 의미하는 정수 MM이 공백으로 구분되어 주어진다. (2≤N≤5,000;(2 \leq N \leq 5\\,000; 1≤M≤⌊N2⌋)1 \leq M \leq \lfloor \frac{N}{2} \rfloor)

셋째 줄부터 N−MN-M개의 줄에 걸쳐 정수 uu와 vv가 공백으로 구분되어 주어진다. 이는 숲 FF에서 uu번 정점과 vv번 정점이 간선으로 연결되어 있다는 것을 의미한다. (1≤u,v≤N;(1 \leq u, v \leq N; u≠v)u \neq v)

이후 MM개의 줄에 걸쳐 정수 uu와 vv가 공백으로 구분되어 주어진다. 이는 숲 FF에서 uu번 정점과 vv번 정점을 연결하는 간선이 특별한 간선이라는 것을 의미한다.

주어지는 모든 특별한 간선 u v는 앞서 등장한 간선 목록에 반드시 포함되어 있음이 보장된다. 숲을 구성하는 각 트리당 정확히 하나의 특별한 간선이 존재함이 보장된다. (1≤u,v≤N;(1 \leq u, v \leq N; u≠v)u \neq v)

R=2R=2일 때 당신은 오필의 역할을 맡아서, 트리 T′T'를 받아서 숲 F′F'를 출력해야 한다.

둘째 줄에 숲 FF과 숲 F′F'의 정점의 개수를 의미하는 정수 NN이 주어진다. 두 번째 시행에서는 MM이 주어지지 않는다.

셋째 줄부터 NN개의 줄에 걸쳐 정수 uu와 vv가 공백으로 구분되어 주어진다. 이는 트리 T′T'에서 uu번 정점과 vv번 정점이 간선으로 연결되어 있다는 것을 의미한다. (1≤u,v≤N+1;(1 \leq u, v \leq N + 1; u≠v)u \neq v)

출력

R=1R=1일 때, NN개의 줄에 걸쳐 각 줄마다 트리 TT의 간선이 연결하는 두 정점의 번호 uu와 vv를 출력한다. (1≤u,v≤N+1;(1 \le u, v \le N + 1; u≠v)u \neq v)

R=2R=2일 때, 첫째 줄에 MM의 값을 출력한다.

둘째 줄부터 N−MN-M개의 줄에 걸쳐 각 줄마다 숲 F′F'의 간선이 연결하는 두 정점의 번호 uu와 vv를 출력한다. (1≤u,v≤N;(1 \le u, v \le N; u≠v)u \neq v)

이후 MM개의 줄에 걸쳐 각 줄마다 숲 F′F'의 특별한 간선이 연결하는 두 정점의 번호 uu와 vv를 출력한다. (1≤u,v≤N;(1 \le u, v \le N; u≠v)u \neq v)

출력 형식을 지키지 않거나, 프로그램이 정상적으로 종료되지 않는 경우, 예상치 못한 채점 결과를 받을 수 있다.

힌트

  • 길이 KK의 순열은 11부터 KK까지의 수가 정확히 한 번 등장하는 수열을 말한다. 예를 들어, \[3,5,1,2,4]\[3,5,1,2,4]와 \[1,3,2]\[1,3,2]는 순열이지만, \[2,3,2]\[2,3,2]또는 \[0]\[0]은 순열이 아니다.
  • 채점 프로그램은 간선의 출력 순서를 고려하지 않는다. 또한 간선 u v와 v u를 동일한 간선으로 판단한다. 즉, 22번째 실행의 입력으로 주어지는 트리 T′T'의 간선 순서 및 각 간선에서 등장하는 정점 번호의 순서는 트리 TT와 무관하다. 또한, 22번째 실행에서 출력하는 간선의 순서와 특별한 간선의 순서, 그리고 각 간선에서 등장하는 정점 번호의 순서를 고려하지 않고 결과를 채점한다.

예제4

  1. 예제 1

    입력
    1
    8 2
    1 2
    1 3
    1 4
    1 5
    6 7
    7 8
    1 4
    6 7
    
    예상 출력
    1 2
    2 3
    3 4
    4 5
    5 6
    6 7
    7 8
    8 9
    
  2. 예제 2

    입력
    2
    8
    9 8
    3 4
    1 2
    2 3
    5 6
    5 4
    6 7
    8 7
    
    예상 출력
    2
    4 1
    1 3
    7 6
    7 8
    2 1
    1 5
    1 4
    7 6
    
  3. 예제 3

    입력
    1
    7 3
    1 2
    3 4
    3 6
    5 7
    1 2
    5 7
    3 6
    
    예상 출력
    1 2
    1 3
    1 4
    1 5
    1 6
    1 7
    1 8
    
  4. 예제 4

    입력
    2
    7
    7 1
    7 2
    7 3
    7 4
    7 5
    7 6
    7 8
    
    예상 출력
    3
    4 7
    2 3
    1 5
    6 5
    6 5
    2 3
    4 7