트리 유사도
시간 제한3초메모리 제한128 MB
두 개의 순서 있는 루트 트리가 주어질 때, 노드 값 변경, 삭제, 삽입 연산의 최소 횟수로 첫 번째 트리를 두 번째 트리로 만드는 값을 구한다.
문제
숫자가 적혀 있는 순서 있는 루트 트리(labeled ordered rooted tree) 두 개 와 가 주어진다. 두 트리 사이의 거리를 구하는 프로그램을 작성하시오. 거리란 를 와 동등하게 만드는 데 필요한 최소 연산 횟수이다.
연산은 다음 세 가지이다.
- 의 한 노드에 적힌 숫자를 다른 숫자로 바꾼다.
- 에서 루트가 아닌 노드 하나를 삭제한다.
- 의 루트 아래 어딘가에 노드 하나를 삽입한다.
와 는 순서 있는 트리이므로, 리프가 아닌 노드가 자식을 개 가지면 그 자식들에는 1번째부터 번째까지 순서가 정해져 있다.
두 트리 와 가 동등하려면, 두 루트에 같은 숫자가 적혀 있고 자식의 개수가 같아야 하며, 각 에 대해 의 번째 자식을 루트로 하는 서브트리와 의 번째 자식을 루트로 하는 서브트리가 서로 동등해야 한다. ()
삭제와 삽입은 다음과 같이 정의된다. 루트가 아닌 노드 가 자식을 개 가지고, 의 부모가 이며 가 의 번째 자식이라고 하자. 를 삭제하면 의 자식들이 가 있던 자리로 올라온다. 즉 의 첫 번째 자식이 의 번째 자식이 되고, 두 번째 자식이 의 번째 자식이 되는 식이다. 의 자식 중 인 번째 자식은 순서가 그대로 유지되고, 인 번째 자식은 모두 의 번째 자식으로 밀려난다.
루트가 아닌 노드 를 삽입하려면 먼저 의 부모가 될 노드 를 고른다. 그런 다음 의 자식 중에서 연속한 부분 수열을 골라 의 자식으로 만들고, 그 자리에 를 끼워 넣는다. 삽입할 때 에는 원하는 숫자를 적을 수 있다.
의 루트를 삭제하거나 루트 위에 새 노드를 삽입하는 것은 불가능하다. 단, 루트에 적힌 숫자는 바꿀 수 있다.
(예를 들어, 노드 를 삭제하는 연산과, 의 2번째 자식부터 4번째 자식까지를 새 노드 의 자식으로 묶어 아래에 를 삽입하는 연산을 생각할 수 있다.)
입력
첫째 줄에 두 트리 와 의 노드 개수 , 이 주어진다. ()
이어지는 개의 줄에는 의 정보가 주어진다. 노드는 번부터 번까지 번호가 매겨지며, 이 개 줄 중 번째 줄에 노드 의 정보가 주어진다. 각 줄에는 그 노드에 적힌 숫자와 자식의 수가 주어지고, 이어서 자식 노드의 번호가 순서대로 주어진다(번호는 부터 시작한다).
그다음 개의 줄에는 같은 형식으로 의 정보가 주어진다.
노드에 적힌 숫자는 항상 음이 아닌 정수이며, 각 트리의 루트는 다른 어떤 노드의 자식도 아닌 노드이다.
출력
를 와 동등하게 만드는 데 필요한 최소 연산 횟수를 출력한다.