#P1330. Nearest Common Ancestors

Nearest Common Ancestors

题目描述

在计算机科学与工程领域,有根树是一种广为人知的数据结构。一个示例如图所示:

在图中,每个节点都用集合 1,2,...,16{1, 2,...,16} 中的一个整数进行标记。节点 88 是这棵树的根节点。如果节点 xx 在根节点到节点 yy 的路径上,那么节点 xx 就是节点 yy 的祖先。例如,节点 44 是节点 1616 的祖先,节点 1010 也是节点 1616 的祖先。事实上,节点 884410101616 都是节点 1616 的祖先。要记住,一个节点也是它自身的祖先。节点88446677 是节点 77 的祖先。

如果节点xx 既是节点 yy 的祖先,又是节点 zz 的祖先,那么节点 xx 就被称为两个不同节点 yyzz 的公共祖先。因此,节点 8844 是节点 $16v 和节点 77 的公共祖先。如果节点xx 是节点 yy 和节点 zz 的公共祖先,并且在它们的所有公共祖先中,xx 是距离 yyzz 最近的,那么节点 xx 就被称为节点 yy 和节点 zz 的最近公共祖先。所以,节点 1616 和节点 77 的最近公共祖先是节点 44,因为节点 44 比节点 88 更接近节点 1616 和节点 77

再举一些例子,节点 22 和节点 33 的最近公共祖先是节点 1010,节点 $6v 和节点 1313 的最近公共祖先是节点 88,节点 44 和节点 1212 的最近公共祖先是节点 44。在最后这个例子中,如果 yyzz 的祖先,那么 yyzv的最近公共祖先就是zv 的最近公共祖先就是 y$。

请编写一个程序,找出一棵树中两个不同节点的最近公共祖先。

输入

输入由 TT 个测试用例组成。测试用例的数量 TT 会在输入文件的第一行给出。每个测试用例以一个整数NN 开始,NN 表示树中节点的数量,2<=N<=10,0002 <= N <= 10,000。这些节点用整数 1,2,...,N1, 2,..., N 进行标记。接下来的 N1N - 1 行,每行包含一对整数,表示一条边——第一个整数是第二个整数的父节点。请注意,一棵有 NN 个节点的树恰好有 N1N - 1 条边。每个测试用例的最后一行包含两个不同的整数,需要计算它们的最近公共祖先。

输出

对于每个测试用例,恰好输出一行。这一行应该包含表示最近公共祖先的整数。

输入示例

2
16
1 14
8 5
10 16
5 9
4 6
8 4
4 10
1 13
6 15
10 11
6 7
10 2
16 3
8 1
16 12
16 7
5
2 3
3 4
3 1
1 5
3 5

输出示例

4
3

来源

2002年大田竞赛