首页 > 其他分享 >最近公共祖先(LCA)

最近公共祖先(LCA)

时间:2023-07-11 12:12:44浏览次数:28  
标签:ve fa 祖先 LCA son int MAXN 公共

最近公共祖先(LCA)

主要思路:一个节点的\(2^n\)的祖先是那个节点\(2^{n-1}\)的祖先的\(2^{n-1}\)的祖先

也就是说\(f[x][n]=f[f[x][n-1]][n-1]\)

还要计算\(log_2\)的值,记录深度

#include<bits/stdc++.h>
using namespace std;

const int MAXN = 5e5 + 10;

int fa[MAXN][30],lg[MAXN],dp[MAXN];

vector<int> ve[MAXN];//记录连接

void dfs(int son,int dad)
{
	fa[son][0] = dad;//第一个祖先
	dp[son] = dp[dad] + 1;
	for(int i = 1;i <= 29;i++) fa[son][i] = fa[fa[son][i - 1]][i - 1];
	int end = ve[son].size();
	for(int i = 0;i < end;i++)
		if(ve[son][i] != dad)
			dfs(ve[son][i],son);
}

void flg(int n) {
	for(int i = 1;i <= n;i++) lg[i] = lg[i - 1] + (i == (2 << lg[i - 1]));
}

int find(int x,int y)
{
	if(dp[x] < dp[y])
		swap(x,y);
	while(dp[x] != dp[y]) x = fa[x][lg[dp[x]-dp[y]]];
	if(x == y) return x;
	for(int i = 29;i >= 0;i--) if(fa[x][i] != fa[y][i]) {x = fa[x][i],y = fa[y][i];}
	return fa[x][0];
}

int main()
{
	ios::sync_with_stdio(false);//写了using namespace std;
	int n,m,s;cin >> n >> m >> s;
	flg(n);
	for(int i = 1;i <= n - 1;i++)
	{
		int x,y;cin >> x >> y;
		ve[x].push_back(y);
		ve[y].push_back(x);
	}
	dfs(s,s);
	for(int i = 1;i <= m;i++)
	{
		int x,y;cin >> x >> y;
		cout << find(x,y) << endl;
	}
}

标签:ve,fa,祖先,LCA,son,int,MAXN,公共
From: https://www.cnblogs.com/xxcdsg/p/17544283.html

相关文章

  • 公共操作-推导式(集合、列表、字典)
    1'''2Python推导式(Comprehensions)是一种简洁而强大的语法,用于创建新的数据结构(如列表、集合和字典)或对现有数据结构进行转换。3它可以使用更简单的方式完成迭代、筛选、映射等操作。45'''6#1.循环生成列表7#1.1准备⼀个空列表8list1=[]9#1.2书......
  • 公共操作
    说明从字符串、列表、元组、字典等维度,找出其共同的操作,比如在运算符、公共方法、容器类型转换运算符 1'''2字符串,列表,字典,集合公共操作之运算符3主要用于字符串\列表\元组的拼接&&倍乘&成员判断4'''56#1.加号+7#1.1字符串拼接8str1=......
  • 公共-八股文
    跨域请求是什么,有什么问题,怎么解决客户端发起请求时,会检查请求的协议、域名、端口是否与当前一致,如果不一致就会出现跨域问题要处理该问题:1.请求:请求通过后台转发至真正的接口[夹一层转发层,利用后台转发,类似网关]2.响应:响应上面加上“access-control-allow-origin”......
  • 1644 题「二叉树的最近公共祖先 II
    对于这道题来说,p和q不一定存在于树中,所以你不能遇到一个目标值就直接返回,而应该对二叉树进行完全搜索(遍历每一个节点),如果发现p或q不存在于树中,那么是不存在LCA的。  ......
  • 题:二叉树中m是n的祖先,通过(后序遍历)可以找到m到n的路径
     选项:先序?中序?后序?层次? 题解:1.首先是对路径的解释:访问一个结点x时,栈中结点恰好是x结点的所有祖先,从栈底到栈顶所有结点加上x结点,就构成了从根结点到x结点的一条路径。2.分析:为什么不是先序遍历?(第一次做题时以为这个路径指的是遍历的结果,那先序自然就满足,但这个路径不是遍历......
  • springcloud - 工程相关步骤以及提取公共部分
    1.创建父工程 配置pom文件删除src文件2.创建子模块配置pom文件3.配置yml文件4.创建启动类5.业务实现当出现公共代码时可以进行提取 例如实体类或者通用工具类等,如下图,提取成一个单独的模块先点击clean  然后点击install,最后将包导入到需要的子模块中实现相互......
  • 关于JAVA项目公共字段自动填充的理解
    公共字段字段填充是什么? “公共字段自动填充”顾名思义,其实就是省略了在程序当中对某些字段手动填写的步骤,大大提高了效率! 为什么要使用公共字段填充技术在我们的程序当中? 在我们项目的开发中,当我们在修改数据库中的某些值的时候,有一些字段属于公共子段,就是有些字段不仅是......
  • LeetCode 235. 二叉搜索树的最近公共祖先
    题目链接:LeetCode235.二叉搜索树的最近公共祖先题意:给定一个二叉搜索树,找到该树中两个指定节点的最近公共祖先。解题思路:对于二叉搜索树,找两个点的最近公共祖先,这两个点所处的位置只有两种情况:情况一:两点在根节点的左右两侧情况二:两点在根节点的一侧(左侧或者右侧)递归......
  • LeetCode 236. 二叉树的最近公共祖先
    题目链接:LeetCode236.二叉树的最近公共祖先题意:给定一个二叉树,找到该树中两个指定节点的最近公共祖先。解题思路:利用二叉树的后序遍历回溯(从下往上遍历)的思想,依次遍历整个二叉树,在遍历过程中,遇到P就返回p的父节点,遇到q就返回q的父节点,(也就是找到了p,q各自的祖先)......
  • 公共语言运行库(CLR)开发系列课程(3):COM Interop基础 学习笔记
    公共语言运行库(CLR)开发系列课程(3):COMInterop基础学习笔记  上章地址什么是COMComponentObjectModel组建对象模型 基于接口(Interface)接口=协议IID标识接口V-table虚表方式调用单继承 对象(Object)实现一个或者多个接口举例:IDispatch......