最近公共祖先(LCA)(洛谷)

最近公共祖先 LCA 笔记 本文介绍了最近公共祖先(LCA)的概念和求解方法。LCA是指树结构中两个节点的公共祖先中离根最远的节点。文章阐述了LCA的7个重要性质,包括单节点、祖先关系、子树分布、遍历顺序等特性。在求解方法部分,详细讲解了朴素算法(时间复杂度O(n))和优化的倍增算法(预处理O(nlogn),查询O(logn)),后者通过预处理祖先数组和二进制拆分提高效率。最后提供了两个相关例题的链接。全文系统性地介绍了LCA的理论基础和实际应用。 阅读详情

P3379
代码:


#include<bits/stdc++.h>
using namespace std;
const int SIZE=500005;
int head[SIZE],nxt[SIZE*2],ver[SIZE*2],tot=0;
int n,m,s,t,d[SIZE],f[SIZE][20];
queue<int> q;
void add(int x,int y){
	ver[++tot]=y,nxt[tot]=head[x],head[x]=tot;
}
void bfs(){
	q.push(s);
	d[s]=1;
	while(!q.empty()){
		int x=q.front();
		q.pop();
		for(int i=head[x];i;i=nxt[i]){
			int y=ver[i];
			if(d[y]) continue;
			d[y]=d[x]+1;
			q.push(y);
			f[y][0]=x;
			for(int j=1;j<=t;j++)
				f[y][j]=f[f[y][j-1]][j-1];
		}
	}
}
int lca(int x,int y){
	if(d[x]>d[y]) swap(x,y);
	for(int i=t;i>=0;i--)
		if(d[f[y][i]]>=d[x]) y=f[y][i];
	if(x==y) return x;
	for(int i=t;i>=0;i--)
		if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
	return f[x][0];
}
int main(){
	scanf("%d%d%d",&n,&m,&s);
	t=(int)(log(n)/log(2))+1;
	for(int i=1;i<=n-1;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		add(x,y),add(y,x);
	}
	bfs();
	for(int i=1;i<=m;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		printf("%d\n",lca(x,y));
	}
	return 0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Eq1Eo5tB-1633441199726)(https://api.nmb.show/1985acg.php)]

iperf3网络性能测试全攻略:从带宽到丢包率的实战技巧 本文提供了iperf3网络性能测试的完整实战指南,涵盖从基础部署到高级诊断的全流程。详细解析了TCP带宽测试的进阶技巧与UDP丢包率分析的深度方法,帮助网络工程师精准量化带宽、丢包率等关键指标,有效定位网络瓶颈并优化性能。 阅读详情

相关推荐

5分钟搞定!Unity中Matcap玻璃材质快速实现(含免费贴图资源)

本文详细介绍了在Unity中快速实现Matcap玻璃材质的方法,从技术原理到实战操作,包括Shader编写、参数调节和性能优化。通过Matcap技术,开发者可以高效创建逼真玻璃效果,特别适合移动端和快速迭代项目。文章还提供了免费贴图资源和进阶优化技巧,帮助提升视觉效果和运行效率。

a1b2c的博客 220

c++LCA(最近公共祖先)

先使两个点的深度相等,如果此时两点所表示的数相同,则这个数就是这两个点的最近公共祖先,不然将它们不断上移,并保持它们表示的数不同,最后输出这两个移出的节点的父亲点。LCA就是在一棵树上求出两个点的最近公共祖先。如图,4和6的最近公共祖先为2。

triangle_617的博客 814

GDSFactory环境配置实战:Python、KLayout与PDK协同指南

GDSFactory是面向光子集成电路(PIC)设计的Python参数化建模框架,其核心价值在于将版图生成从手动绘图升维为可编程、可复现、可集成CI/CD的工程实践。它依赖Python科学计算生态(如NumPy)、EDA可视化工具KLayout的深度Python绑定,以及工艺厂PDK的标准化接入,三者构成‘计算-几何-工艺’技术闭环。典型应用场景包括教学级SiEPIC PDK快速原型、工业级AIM Photonics流片准备,以及自动化DRC与光学仿真流水线构建。本文聚焦GDSFactory落地中最关键也最

weixin_30983353的博客 369

C++ LCA算法详解

对于有根树的两个节点和,其最近公共祖先表示一个节点,满足是和的祖先,且的深度尽可能大(离和尽可能近)。一个节点也可以是它自己的祖先。

YYDS314的博客 660

【U-Net 数据集制作】如何制作自己的图像分割数据集?(标注与格式转换),图像分割数据集制作与转换神器

在前面的课程中,我们像搭积木一样手写了 U-Net 的网络架构。很多同学迫不及待地想把自己的图片喂进网络开始“炼丹”。但是,深度学习界有一句名言:“数据决定了模型的上限,而网络结构只是在逼近这个上限。用标注工具标出来的是 JSON 文件,怎么变成 U-Net 需要的黑白掩码(Mask)图?为什么我的 Mask 肉眼看是黑白的,一放进 PyTorch 训练就报?如何快速按 8:2 的比例把几千张图片和标签划分成训练集和验证集?

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 195

手把手教你学Simulink--基础储能管理场景实例:基于Simulink的扩展卡尔曼滤波(EKF)SOC估计算法仿真

本文介绍了基于Simulink的扩展卡尔曼滤波(EKF)在电池SOC估算中的应用。通过Thevenin等效电路建立非线性电池模型,详细阐述了EKF的状态预测和更新过程。在Simulink中搭建了完整的仿真系统,包括电池模型、EKF核心算法模块和误差分析模块。通过脉冲放电和变电流充放电两种工况测试,验证了EKF算法在短期误差(<0.8%)、长期累积误差(<1.5%)和动态响应时间(30ms)方面的优越性能,相比传统安时积分法显著提高了估算精度。文章还提出了自适应EKF、多模型融合等进阶优化方向,为

MHD0815的博客 99

倍增法+LCA(C/C++)

倍增法(C/C++)

m0_71934846的博客 2635

使用C#实现的多人语音视频系统:WebSocket与WebRTC集成

通过上述的代码示例,我们可以使用C#编写一个多人语音视频系统,该系统集成了WebSocket和WebRTC技术。当然,这只是一个简单的示例,实际的多人语音视频系统可能需要更多的功能和优化。通过结合这两种技术,我们可以实现实时的语音和视频通信,支持多人同时参与。在上述代码中,我们创建了一个WebSocket服务器,监听在本地的8080端口,并创建了一个WebRTC连接。接下来,我们将详细介绍如何使用C#编写一个多人语音视频系统,包括使用WebSocket建立连接和使用WebRTC进行实时通信。

TjsReact的博客 1634

洛谷 P3379 【模板】最近公共祖先(LCA)

摘要: 本文介绍了求解有根树中最近公共祖先(LCA)问题的多种方法,重点讲解了倍增算法的实现。文章首先描述了同步前进法的基本思路,并指出其O(n)时间复杂度在处理大规模数据时会超时。随后详细阐述了基于倍增思想的优化算法,通过预处理fa数组(记录各节点向上走2^j步到达的节点),将时间复杂度降至O(logn)。文中给出了完整的算法实现步骤,包括初始化、深度优先遍历预处理、以及利用lg数组优化查询过程的具体代码。此外还简要提及了其他解法如Tarjan、DFS序和树链剖分等方法,为读者提供了多种解决LCA问题的思

君义NOIP的博客 1080

详解【计算机类&面试真题】军队文职考试——第7期:C盘格式化需要注意什么?| 两台笔记本连起来后ping不同,可能存在哪些问题?| 模拟信号到数字信号是如何转化的?| 计算机由哪些部件组成?

这是我分享的系列面试知识——军队文职(计算机类)面试真题详解(第7期)。本期分享:两台笔记本连起来后ping不同,你觉得可能存在哪些问题?模拟信号到数字信号是如何转化的?谈一谈计算机由哪些部件组成?如何加强计算机网络安全管理?若通过域名无法访问,而通过IP地址能访问。这是怎么回事?你将如何解决?谈一谈C盘格式化需要注意什么?开放类题目:如果应聘的岗位和你想的差距很远,你怎么办?

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 1922

Qt Quick/QML入门到精通_专栏demo对应文章目录(目前50个左右demo/长期更新)

自定义图标下拉列表框的效果如下所示:自定义三态按钮的效果如下所示:传送门:53.qt quick-自定义三态按钮、自定义图标下拉列表框_诺谦的博客-优快云博客传送门:59.qt quick-qml调色板(颜色取色器)实现、自定义QQuickStyle样式_诺谦的博客-优快云博客63.qt quick-QML侧边滑动栏(不需要任何图片资源,支持自定义左右方向和大小)_诺谦的博客-优快云博客_qt实现好看侧边栏。...

抵抗时间扭曲,坚持做一件有意义的事 2万+

洛谷 P3379:最近公共祖先(LCA)← RMQ+欧拉序

利用欧拉序求 LCA,本质上就是一个 RMQ 问题。而 RMQ 问题常用 ST 算法来初始化数据。

hnjzsyjyj的专栏 1343

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【模板】最近公共祖先(LCA)(洛谷P3379)

【代码】【模板】最近公共祖先(LCA)(洛谷P3379)

GordrnGhost的博客 273

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

最近公共祖先(LCA)

最近公共祖先(LCA) 1. 最近公共祖先原理 原理 LCA问题:在一棵有根树中,一个节点的祖先节点是指它本身或者它父节点的祖先。给定两个节点,两个点共同的祖先中距离两者最近的节点就是这两个节点的最近公共祖先。需要注意的是最近公共祖先可能是这两个节点中的某一个。 LCA问题的解法有很多种,下面介绍四种,其中第二种、第三种最常用 1. 向上标记法 做法:求两个节点p、q的最近公共祖先原理,可以任选一个点,比如点p,沿着点p向上走,将走过的节点标记为true,代表已经走过,走到根节点后停止;然后让q

weixin_42638946的博客 8025

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

详解最近公共祖先(LCA)

详解最近公共祖先(LCA)

weq2011的博客 6028

c++最近公共祖先LCA

今天来介绍一个c++中的算法:最近公共祖先LCA。最近公共祖先是什么呢?就是给出在树上的两个节点,求出它们的最近公共祖先,也可以理解成深度最深的公共祖先。这个算法用处很大,比如我们可以用它来求任意两个节点的距离。具体后面会讲。i++){//i从1开始!= edge[now][i]){//注意!!now的儿子不能再回到now的父亲了h;i++, h >>= 1){//例如h = (1011)2,那么第一次要跳,并且跳2^1也就是2^0级。

zhaoniuniu0309的博客,刚刚开始写博文的新手,有不对的地方请谅解。 2048

最近公共祖先LCA算法

我是菜鸟ACMer(qwq),之前学图论板块的LCA算法做的一些笔记,适合小白,分享出来希望能帮助大家!

lwltql的博客 2529

树上最近公共祖先(LCA)

算法,图论,LCA

m0_74376772的博客 2198

LCA-最近公共祖先

最近公共祖先简称。两个节点的最近公共祖先,就是这两个点的公共祖先里面,离根的那个。为了方便,我们记某点集 的最近公共祖先为LCAU1​U2​...Un​或LCAs。

weixin_42238183的博客 1795

最近公共祖先LCA(算法篇)

本篇将会讲解朴素和在线倍增的最近公共祖先算法,当然还有离线的算法,但是因为种种原因,Moon就更新到这了,后期可能会回归选择更新,感谢大家的喜欢

hellmorning的博客 2448

LCA最近公共祖先问题详解

图论和树结构中最近公共祖先(Least Common Ancestor,LCA)是一个经典的问题,本文我将详细介绍LCA问题的常见求解算法、优化策略,并结合Java代码示例,带你全面掌握这一重要算法问题的求解方法

1493

【C++】最近公共祖先 LCA

最近公共祖先 百科名片 最近公共祖先 Lowest Common Ancestors LCA 简单引入 对于有根树T的两个结点u、v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u、v的祖先且x的深度尽可能大。 红色的都是是A和B的公共祖先,但只有最近的C才是最近公共祖先。 LCA问题是树上的一个经典问题,在很多方面有着广泛的应用,比如求LCP(最长公共前缀),接下来我们就来介绍...

Ljnoit 3500

最近公共祖先(LCA)(树上倍增)

什么是最近公共祖先呢?其实这是在树上定义的,比如说x节点,那么x节点以及x节点的父节点以及x节点的父节点的父节点的……父节点,这都算是x的祖先,而公共祖先显然是对于两个节点而言的,就是一个节点同时是这两个节点的祖先,那么这个节点就是两个节点的公共祖先,最近公共祖先当然是离他们最近的公共祖先了。画个图来说明一下: ...

AC__dream的博客 1833

LCA(最近公共祖先)(倍增 + tarjan)

LCA最近公共祖先求解

m0_74453078的博客 1582

【树上算法】最近公共祖先(LCA)

最近公共祖先 前言 最近公共祖先是在树上的一个算法。这里就提到了树。树想必大家都再熟悉不过了,在计算机中,我们可以把树看成一种特殊的图。 这种图就叫有向无环联通图。顾名思义,没有环,有向图,nnn个节点n−1n-1n−1条边。 一、什么是最近公共祖先 最近公共祖先(Lowest Common Ancestors,简称LCA)是一种典型的树上算法。 最近公共祖先是针对树上两个节点u和v的。这里就涉及到了祖先这个概念。a是b的祖先就是说a是b的父亲的父亲的父亲……(也包括父亲)。 现在我们就要求一个节点,既是u

hexu2010的博客 5006

[算法日常] LCA 最近公共祖先

计算LCA的算法

Brilliant_Sky的博客 1560
上一篇: 最小生成树(洛谷)
下一篇: 洛谷有人疯了!!!
scj2021
博客等级 码龄5年 669粉丝 30原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值