C++最近公共祖先(LCA版)

这篇博客介绍了如何使用C++解决寻找有根树中指定节点对的最近公共祖先(LCA)问题。通过深度优先搜索(DFS)确定树的深度,并使用辅助数组记录节点的祖先信息。算法思路包括将节点移动到同一水平线,然后逐级向上查找直到找到相同的祖先节点。
摘要由CSDN通过智能技术生成

C++最近公共祖先(LCA版)

问题描述
给出一棵有N(编号1到N)个节点的有根树,求出指定节点对的最近公共祖先!

对于树中节点x而言,从根节点到达x的这一条路径中经过的所有节点,都称为x的祖先。
如上图所表示的树中, 根节点为8。8、4、10、16都是12的祖先。对于6和12这对节点而言,从6出发往上朝根走和从12出发往上朝根走的两条路径最早交汇的地点是4号节点,因此4号点是6和12的最近公共祖先。
同理,11和9的最近公共祖先是8; 10和3的最近公共祖先是10;2和7的最近公共祖先是4…

输入格式
第一行,一个整数N。表示树中节点总数
接下来N-1行,每行两个整数x和y,表示x是y的父亲。
接下来一行,一个整数M,表示询问的总数
接下来M行,每行两个整数a和b,表示询问a和b的最近公共祖先。

输出格式
M行,每行一个整数,表示对应询问的答案。

大概思路: 用dep[]来标记树的深度,fa[v][k]来标记v点向上2^k
步骤:1.DFS来确定层数,将x,y移到同一水平线;
2.将x,y同时向上移,如果x==y就return x;
不说了,直接看代码
代码:

#include<bits/stdc++.h>
using namespace std;
int Last[10010],Next[10010],End[10010],n,m,x,y,z,Dep[10010],Fa[10010][10010];
void Dfs(int x){
   
	int i,k,y;
	Dep[x]=Dep[Fa[x][0]]+<
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值