Nearest Common Ancestors
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
#include <iostream>
#include <map>
using namespace std;
int b[11000],c[11000];
int main()
{int t,n,a1,a2,i,j;
cin>>t;
while(t--){
map<int,int>m;
map< int, int >::iterator kan1;
map< int, int >::iterator kan2;
cin>>n;
bool p;
for(i=0;i<n-1;i++)
{cin>>a1>>a2;
m[a2]=a1;
}
cin>>a1>>a2;
kan1=m.find(a1);
kan2=m.find(a2);
b[0]=a1;
c[0]=a2;
j=1;
while(m.count(kan1->second))
{
b[j]=kan1->second;
kan1=m.find(kan1->second);
j++;
}
b[j]=kan1->second;
a1=j;
j=1;
while(m.count(kan2->second))
{
c[j]=kan2->second;
kan2=m.find(kan2->second);
j++;
}
c[j]=kan2->second;
a2=j;
for(i=0;i<=a1;i++)
{p=0;
for(j=0;j<=a2;j++)
if(b[i]==c[j])
{p=1;break;}
if(p==1)break;
}
cout<<b[i]<<endl;
}
return 0;
}