Skip to content

# Kevin's Home

## POJ1330 Nearest Common Ancestors

LCA, 图论, tarjan, 倍增2 min read

Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 17734 Accepted: 9405

## Description

A rooted tree is a well-known data structure in computer science and engineering. An example is shown below:

In the figure, each node is labeled with an integer from {1, 2,...,16}. Node 8 is the root of the tree. Node x is an ancestor of node y if node x is in the path between the root and node y. For example, node 4 is an ancestor of node 16. Node 10 is also an ancestor of node 16. As a matter of fact, nodes 8, 4, 10, and 16 are the ancestors of node 16. Remember that a node is an ancestor of itself. Nodes 8, 4, 6, and 7 are the ancestors of node 7. A node x is called a common ancestor of two different nodes y and z if node x is an ancestor of node y and an ancestor of node z. Thus, nodes 8 and 4 are the common ancestors of nodes 16 and 7. A node x is called the nearest common ancestor of nodes y and z if x is a common ancestor of y and z and nearest to y and z among their common ancestors. Hence, the nearest common ancestor of nodes 16 and 7 is node 4. Node 4 is nearer to nodes 16 and 7 than node 8 is.

For other examples, the nearest common ancestor of nodes 2 and 3 is node 10, the nearest common ancestor of nodes 6 and 13 is node 8, and the nearest common ancestor of nodes 4 and 12 is node 4. In the last example, if y is an ancestor of z, then the nearest common ancestor of y and z is y.

Write a program that finds the nearest common ancestor of two distinct nodes in a tree.

## Input

The input consists of T test cases. The number of test cases (T) is given in the first line of the input file. Each test case starts with a line containing an integer N , the number of nodes in a tree, 2<=N<=10,000. The nodes are labeled with integers 1, 2,..., N. Each of the next N -1 lines contains a pair of integers that represent an edge --the first integer is the parent node of the second integer. Note that a tree with N nodes has exactly N - 1 edges. The last line of each test case contains two distinct integers whose nearest common ancestor is to be computed.

## Output

Print exactly one line for each test case. The line should contain the integer that is the nearest common ancestor.

## Sample Input

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

## Source

Taejon 2002

tarjan+并查集求LCA模板。将u的子儿子v递归合并到u，若y在x的子树上，则根据并查集的性质，公共祖先即为x（father[y]）。若y和x不再同一子树上。则根据dfs回溯的性质，则搜完y之后一定是回溯到x,y的最近公共祖先才能搜到x的，而此时由并查集的性质，回溯的节点刚好就是father[y]

LCA还可以用倍增来求：（思想很普通，只是以2进制的步长向上走：dp[i][j]表示节点i向上走2^j步到达的节点。）

LCA还可以转化为RMQ问题（个人更喜欢此方法，在线，且效率高）

© 2020 by Kevin's Home. All rights reserved.