LCA(Lowest Common Ancestors),即最近公共祖先,是指在有根树中,找出某两个节点u和v最近的公共祖先。(若u为v的祖先或者v为u的祖先,则LCA(u,v)就是作为祖先的那个节点)
现在有一棵以1为根的有根树,树上一共有n个节点。现在有m次查询,每次询问两个节点的LCA。
如图所示的数据中,LCA(3,5)=1,LCA(2,5)=2,LCA(3,4)=1,LCA(2,4)=2,LCA(5,5)=5.
Input
第1行:一个正整数n,表示树上节点的个数。(1<=n<=1000) 第2行-第n行:每行两个正整数u,v,表示节点u到节点v有一条边。(1<=u,v<=n) 第n+1行:一个正整数m,表示查询的次数。(1<=m<=1000) 第n+2-第n+m+1行:每行两个正整数a,b,表示要查询的两个节点的编号。(1<=a,b<=n)
Output
对于每个询问,输出一个正整数表示答案,并换行。
Sample Input
5
1 2
1 3
2 4
2 5
5
3 5
2 5
3 4
2 4
5 5
Sample Output
1
2
1
2
5
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<stack>
#define N 1000
using namespace std;
int main(){
int n,m;
//int u[N],v[N];
int parent[N];
int i,tmp,cmp;
while(~scanf("%d",&n)){
n--;
while(n--){
scanf("%d %d",&tmp,&i);
parent[i]=tmp;
}
int ans=1;
scanf("%d",&m);
int a,b;
while(m--){
scanf("%d %d",&a,&b);
stack<int> sa;
stack<int> sb;
while(a){
sa.push(a);
a=parent[a];
}
while(b){
sb.push(b);
b=parent[b];
}
while(!sa.empty() && !sb.empty() && sa.top()==sb.top()){
ans = sa.top();
sa.pop();
sb.pop();
}
printf("%d\n", ans);
}
}
return 0;
}