Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 34208 | Accepted: 17372 |
Description
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
Output
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
Sample Output
4 3
C/C++:
1 #include <map> 2 #include <queue> 3 #include <cmath> 4 #include <vector> 5 #include <string> 6 #include <cstdio> 7 #include <cstring> 8 #include <climits> 9 #include <iostream> 10 #include <algorithm> 11 #define INF 0x3f3f3f3f 12 using namespace std; 13 const int my_max = 10010; 14 15 int my_pre[my_max], my_book[my_max], t, n, a, b; 16 17 int my_lca() 18 { 19 while (b) 20 { 21 my_book[b] = 1; 22 b = my_pre[b]; 23 } 24 while (!my_book[a]) 25 a = my_pre[a]; 26 return a; 27 } 28 29 int main() 30 { 31 scanf("%d", &t); 32 while (t --) 33 { 34 memset(my_book, 0, sizeof(my_book)); 35 memset(my_pre, 0, sizeof(my_pre)); 36 scanf("%d", &n); 37 for (int i = 1; i < n; ++ i) 38 { 39 scanf("%d%d", &a, &b); 40 my_pre[b] = a; 41 } 42 scanf("%d%d", &a, &b); 43 44 printf("%d\n", my_lca()); 45 } 46 return 0; 47 }