B - 最近公共祖先(LCA)

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值