트리와 집합과 쿼리
시간 제한4초메모리 제한512 MB
트리에서 질의마다 정점 u를 U에, v를 V에 추가할 때, U의 돌을 한 번에 한 칸씩 옮겨 V로 만들 수 있는지 판정하고 그 값들의 합을 구합니다.
문제
개의 정점으로 이루어진 트리가 있다.
트리의 정점들 위에 돌을 놓을 수 있다. 한 정점에는 돌을 하나만 놓을 수 있다.
이 트리에는 특이한 성질이 있다. 인접한 두 정점에는 돌을 모두 놓을 수 없다.
트리 정점들의 부분집합 와 에 대해, 에 포함된 정점에만 돌이 놓인 상태에서 시작하여 돌을 인접한 정점으로 옮기는 작업만 반복해서 에 포함된 정점에만 돌이 놓인 상태를 만들 수 있다면 로 하고, 그렇지 않으면 으로 함수 를 정의하자. 물론 옮기는 중간 과정에서도 인접한 두 정점에 돌이 동시에 놓여서는 안 된다.
당신의 과제는 여러 집합 쌍에 대해 의 값을 계산하는 것이다.
처음에 두 집합 , 는 빈 집합이다. 각 쿼리는 두 정수 , 로 이루어져 있고, 개의 쿼리가 주어진다. 쿼리 하나는 에 정점 를, 에 정점 를 추가한다.
쿼리를 하나 처리할 때마다 의 값을 계산한다. 마지막으로 개의 값을 모두 더한 합을 출력하시오.
입력
첫째 줄에 테스트 케이스의 개수를 나타내는 자연수 가 주어진다. 이후 개의 테스트 케이스가 차례로 주어진다. ()
각 테스트 케이스의 첫 줄에는 트리의 정점 개수 이 주어진다. ()
이어지는 개의 줄 각각에는 간선의 양 끝점을 나타내는 두 정수 와 가 주어진다. ()
다음 줄에는 쿼리의 개수 가 주어진다. ()
이어지는 개의 줄 각각에는 와 에 추가될 정점 와 가 주어진다. ()
개의 쿼리가 끝난 뒤 집합 와 집합 는 인접한 두 정점을 포함하지 않음이 보장된다.
모든 테스트 케이스의 의 합은 2,000,000을 넘지 않는다.
출력
각 테스트 케이스마다 첫 줄에 "Case #C"를 출력한다. 여기서 는 테스트 케이스의 번호이다. 다음 줄에는 계산한 개의 값의 합을 출력한다.