메뚜기 경로

트리와 두 정점 s, t가 주어질 때, 경로 성분에 대한 재귀 규칙으로 정의된 특정 그래슈퍼 경로를 구성한다.

보통7트리DFS재귀구현아직 제출이 없습니다시간 제한1초메모리 제한512 MB

문제

메뚜기 한 마리가 트리를 탐험하려고 한다. 트리는 어떤 두 정점도 정확히 하나의 경로로 이어진 무향 그래프다. 트리의 한 정점에 있는 메뚜기는 거리가 33 이하인 다른 정점으로만 뛸 수 있다. 두 정점의 거리는 두 정점을 잇는 경로에 있는 간선의 수다. 메뚜기는 지금 있는 정점 ss에서 출발해 원하는 정점 tt에서 끝나도록, 트리의 모든 정점을 정확히 한 번씩 방문하려고 한다.

정점이 nn개인 트리와 두 정점 ss, tt가 주어진다. sstt의 메뚜기 경로는 트리의 모든 정점을 나열한 순서 u1,u2,,un\langle u_1, u_2, \ldots, u_n \rangle 중에서 u1=su_1 = s, un=tu_n = t이고 {1,2,,n1}\{1, 2, \ldots, n-1\}의 모든 ii에 대해 메뚜기가 uiu_i에서 ui+1u_{i+1}로 뛸 수 있는 것을 말한다. 트리의 어떤 두 정점을 골라도 메뚜기 경로가 존재한다는 사실은 1960년에 증명되었다.

아래 그림의 트리에서 s=7s = 7, t=10t = 10일 때 7,6,5,4,1,2,3,8,9,11,12,10\langle 7, 6, 5, 4, 1, 2, 3, 8, 9, 11, 12, 10 \rangle은 메뚜기 경로다. 정점 55와 정점 44의 거리는 33이므로 메뚜기는 55에서 44로 뛸 수 있지만, 55에서 33으로는 뛰지 못한다. 메뚜기 경로는 여러 개일 수 있으므로 출력에서 그중 하나를 정해 둔다.

그림: s=7s = 7에서 t=10t = 10으로 가는 메뚜기 경로 하나.

입력

첫 줄에 트리의 정점 수 nn이 주어진다 (2n1000002 \le n \le 100\,000). 다음 n1n - 1개의 줄에는 각각 두 정수 uuvv가 주어지며, 정점 uu와 정점 vv를 잇는 간선을 뜻한다. 정점에는 11부터 nn까지 번호가 붙어 있다. 마지막 줄에는 서로 다른 두 정수 sstt가 주어진다. 각각 메뚜기 경로의 시작 정점과 끝 정점이다.

출력

메뚜기 경로는 여러 개일 수 있으므로, 다음 규칙이 정하는 경로 하나를 출력한다. 메뚜기가 지나는 정점을 순서대로 nn개의 줄에 한 정점씩 출력한다.

  1. ss에서 tt로 가는 유일한 경로를 x1=s,x2,,xk=tx_1 = s, x_2, \ldots, x_k = t라고 하자.
  2. 이 경로의 간선 k1k - 1개를 트리에서 지우면 트리가 kk개의 컴포넌트로 나뉜다. xix_i가 들어 있는 컴포넌트를 CiC_i라 하고, CiC_ixix_i를 루트로 삼는다.
  3. 루트가 정해진 트리의 정점 vv에 대해 수열 f(v)f(v)를 다음과 같이 정의한다. vv에 자식이 없으면 f(v)f(v)는 정점 vv 하나짜리 수열이다. 자식이 있으면 번호가 작은 것부터 c1<c2<<cmc_1 < c_2 < \cdots < c_m이라 할 때, f(v)f(v)vv 뒤에 f(c1)f(c_1)을 뒤집은 수열, f(c2)f(c_2)를 뒤집은 수열, 그렇게 f(cm)f(c_m)을 뒤집은 수열까지 차례로 이어 붙인 수열이다.
  4. 답은 f(x1),f(x2),,f(xk1)f(x_1), f(x_2), \ldots, f(x_{k-1})을 이 순서로 이어 붙인 뒤 f(xk)f(x_k)를 뒤집은 수열을 마지막에 붙인 것이다. 각 f(xi)f(x_i)는 컴포넌트 CiC_i 안에서 계산한다.

이 순서는 항상 메뚜기 경로다.