首页 > 其他分享 >LCA学习笔记

LCA学习笔记

时间:2024-10-17 19:22:31浏览次数:6  
标签:fa int top LCA 笔记 学习 dep lca 序列

LCA学习笔记

定义:在一棵树中,两个节点的最近公共祖先。

1.暴力求法

处理出每个点的深度,先把深度较深的一个点沿着父节点方向一直走到与另一个点相同的深度,如果此时两个点不同,那么两个点一起向上跳(代码实现过于简单,这里不过多赘述)

2.倍增优化暴力

注意到我们在暴力求法中,点是一步一步向上跳的,那我们有没有办法加快这个过程呢?这个时候就要使用倍增了,预处理出每个节点的深度dep,和它的 2^i 级祖先,那么我们可以在跳的时候一次进行多步跳跃

预处理代码(也可以写在一起)

void dfs(int u,int fa){
	dep[u]=dep[fa]+1,f[u][0]=fa;
	for(int i=head[u];i;i=ne[i]){
		int v=to[i];
		if(v==fa) continue ;
		dfs(v,u);
	}
}
void init(){
	for(int j=1;j<=20;++j)
		for(int i=1;i<=n;++i)
			f[i][j]=f[f[i][j-1]][j-1];
}

查询LCA:

这个要注意:在枚举祖先时一定要倒序枚举i,因为要从里根近的一步一步走到深度更大的,剩下的根据暴力的思想不难写出:

int lca(int x,int y){
  if(dep[x]<dep[y]) swap(x,y);
	for(int i=20;i>=0;--i){
		if(dep[f[x][i]]>=dep[y]) x=f[x][i];
		if(x==y) return x;
	}
	for(int i=20;i>=0;i--){
		if(f[x][i]!=f[y][i]){
			x=f[x][i];
			y=f[y][i];
		}
	}
	return f[x][0];
}

3.RMQ

首先把这棵树转成欧拉序列,用pos[i]记录树上i点第一次出现在欧拉序列中的位置,由于欧拉序列的性质,两个点的lca一定时两个点在序列中出现的区间中dep最小的点所对应的点,(可以结合欧拉序列理性感受一下),那么树上求lca问题就可以转化成序列RMQ问题了

初始化:

int pos[N];//树上节点在序列第一次出现中的编号 
int a[N];//欧拉序列 
int dep[N];
void dfs(int u,int fa){
	dep[u]=dep[fa]+1;
	pos[u]=++tot;
	a[++tot]=dep[u];
	for(int i=head[u];i;i=ne[i]){
		int v=to[i];
		if(v==fa) continue ;
		dfs(v,u);
	}
	a[++tot]=dep[u];
}

查询

(静态区间最小值,不过多赘述)

4.树链剖分

初始化

常规进行重链剖分或者长链剖分(只求lca的话建议长链剖分),不贴代码

查询lca

根据树剖已经拆树成链,也和倍增类似可以一次跳多个

int lca(int x,int y){
	while(top[x]!=top[y]){
		if(dep[top[x]]>dep[top[y]])
			x=f[top[x]];
		else
			y=f[top[y]];
	}
	if(dep[u]>dep[v]) return v;
	return u;
}

5.Tarjan求lca

有待完善

标签:fa,int,top,LCA,笔记,学习,dep,lca,序列
From: https://www.cnblogs.com/vicem/p/18472916

相关文章

  • 从单细胞和空间转录组学推断模式驱动的细胞间流动(Flowsig)--生信算法笔记
    **Inferringpattern-drivingintercellularflowsfromsingle-cellandspatialtranscriptomics**Almet,A.A.,Tsai,YC.,Watanabe,M.etal.Inferringpattern-drivingintercellularflowsfromsingle-cellandspatialtranscriptomics.NatMethods21,1806......
  • 学习编程是自学好,还是报班好?看完这篇你就明白了!
    编程已经成为现代社会一项重要的技能,无论是为了提升职业竞争力还是为了满足个人兴趣,越来越多的人想要学习编程。然而,面对学习编程的不同选择,很多人会问:“学习编程是自学好,还是报班好?”这其实是因人而异的,因为每种方式都有各自的优点和不足。本文将详细分析自学和报班两种方式......
  • 初学编程应该看书还是看视频?找到最适合你的学习方式
    对于编程初学者来说,选择合适的学习资源是非常重要的。当面临“看书还是看视频”的问题时,很多人都会感到困惑,因为这两种学习方式各有优缺点。无论你是选择书籍还是视频,关键是找到适合自己的学习方式。本文将对这两种学习方法进行详细比较,帮助你做出最适合自己的选择。1.通过......
  • Java中JDK8-17新特性的学习上
    JDK8-17新特性(第一部分)目录JDK8-17新特性(第一部分)Lambda表达式新的时间/日期API的使用optional类的使用接口增强Lambda表达式Lambda表达式是JDK1.8之后的一种语法,是一个匿名函数,是对匿名函数的简写形式,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行......
  • 2024年软件设计师中级(软考中级)详细笔记【6】结构化开发方法(分值3~4)
    目录前言6.1系统分析与设计概述6.1.2系统设计的基本原理6.1.3系统总体结构设计6.1.4系统文档6.2.2数据流图6.2.3数据字典(DD)6.5用户界面设计6.5.1用户界面设计的黄金原则杂题习题:结语前言在备考软件设计师中级考试的过程中,我遇到了些许挑战,也收获了宝贵的......
  • 用迁移学习促进竞争影响最大化中的强化学习
    【文献阅读】【2018IEEE/WIC/ACM(WI)】BoostingReinforcementLearninginCompetitiveInfluenceMaximizationwithTransferLearning目录【文献阅读】【2018IEEE/WIC/ACM(WI)】BoostingReinforcementLearninginCompetitiveInfluenceMaximizationwith......
  • 【最新】Kali linux零基础学习教程(超详细),从下载、安装到使用
    一、下载kaliLinux镜像https://www.kali.org/get-kali/#kali-installer-images二、开始安装kalilinux基于Debianlinux,所以选择的时候安装你下载的iso镜像来选择32位或者64位。1、选择图形化安装2、中文简体,continue继续----中国—汉语3、网络自动配置失败,问题......
  • 小白怎么入门CTF,看这个就够了(附学习笔记、靶场、工具包下载)
     CTF靶场:CTF刷题,在校生备战CTF比赛,信安入门、提升自己、丰富简历之必备(一场比赛打出好成绩,可以让你轻松进大厂,如近期的各种CTF杯),在职人员可以工作意外提升信安全技能。渗透实战靶场:挖洞、渗透实战(web、域、横向渗透),适合实战能力需要大幅度提升的同学。一、CTF入门最近很多......
  • 为什么很多人自学黑客,没过多久就放弃了(掌握正确的学习路线,才不会半途而废)
     网络安全是一个不断发展和演变的领域,以下是一个网络安全学习路线规划,旨在帮助初学者快速入门和提高自己的技能:基础知识:网络安全的基础知识包括网络结构、操作系统、编程语言等方面的知识。学习这些基础知识对理解网络安全的原理和技术至关重要。网络协议:了解各种网络协议的......
  • 【深度学习代码调试2】环境配置篇(中) -- 列出conda环境中所有env的pytorch版本
    【深度学习代码调试2】环境配置篇(中)--列出conda环境中所有env的pytorch版本写在最前面如何检查所有Conda环境中的PyTorch版本(并重点提示PyTorch1.7.1版本)1.列出所有Conda环境2.检查每个环境中的PyTorch版本方法1:使用Python命令检查PyTorch版本方法2......