当前位置: 首页 > news >正文

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

【题目来源】

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

【题目描述】

如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先。

【输入】

第一行包含三个正整数 \(N,M,S\),分别表示树的结点个数、询问的个数和树根结点的序号。

接下来 \(N-1\) 行每行包含两个正整数 \(x, y\),表示 \(x\) 结点和 \(y\) 结点之间有一条直接连接的边(数据保证可以构成树)。

接下来 \(M\) 行每行包含两个正整数 \(a, b\),表示询问 \(a\) 结点和 \(b\) 结点的最近公共祖先。

【输出】

输出包含 \(M\) 行,每行包含一个正整数,依次为每一个询问的结果。

【输入样例】

5 5 4
3 1
2 4
5 1
1 4
2 4
3 2
3 5
1 2
4 5

【输出样例】

4
4
1
4
4

【算法标签】

《洛谷 P3379 最近公共祖先(LCA)》 #最近公共祖先LCA# #模板题# #O2优化#

【代码详解】

#include <bits/stdc++.h>
using namespace std;const int N = 500005;
int n, m, s, a, b;  // n: 节点数,m: 查询数,s: 根节点
vector<int> e[N];   // 邻接表存储树
int dep[N];         // 节点的深度
int fa[N][20];      // 倍增祖先表,fa[u][i]表示u的2^i级祖先// 深度优先搜索,预处理深度和祖先表
void dfs(int u, int father)
{// 计算当前节点的深度dep[u] = dep[father] + 1;// 初始化直接父节点fa[u][0] = father;// 预处理倍增祖先表for (int i = 1; i <= 19; i++)fa[u][i] = fa[fa[u][i-1]][i-1];// 遍历子节点for (int v : e[u])if (v != father)  // 避免走回父节点dfs(v, u);
}// 求两个节点的最近公共祖先
int lca(int u, int v)
{// 第一步:将u和v调整到同一深度if (dep[u] < dep[v]) swap(u, v);// 将u向上跳,直到与v同深度for (int i = 19; i >= 0; i--)if (dep[fa[u][i]] >= dep[v])u = fa[u][i];// 如果此时u==v,说明v是u的祖先if (u == v) return v;// 第二步:u和v同时向上跳for (int i = 19; i >= 0; i--)if (fa[u][i] != fa[v][i])  // 如果祖先不同,就一起向上跳u = fa[u][i], v = fa[v][i];// 此时u和v的父节点就是LCAreturn fa[u][0];
}int main()
{// 输入树的信息cin >> n >> m >> s;// 读入n-1条边for (int i = 1; i < n; i++){int x, y;cin >> x >> y;e[x].push_back(y);e[y].push_back(x);}// 从根节点s开始DFS,预处理深度和祖先表dfs(s, 0);// 处理m个查询for (int i = 1; i <= m; i++){int a, b;cin >> a >> b;cout << lca(a, b) << endl;  // 输出LCA}return 0;
}

【运行结果】

5 5 4
3 1
2 4
5 1
1 4
2 4
4
3 2
4
3 5
1
1 2
4
4 5
4
http://www.jsqmd.com/news/394608/

相关文章:

  • 题解:洛谷 P1395 会议
  • Claude Sonnet 4.6发布,操控计算机能力大幅提升,100万token上下文
  • 京东 e 卡闲置别浪费!可可收更安心,这样选最省心 - 可可收
  • 题解:洛谷 P3372 【模板】线段树 1
  • 研磨废水回用厂家怎么挑?2026年攻略来了,实验室废水处理/研磨废水回用(处理)/零排放清洗,研磨废水回用源头厂家找哪家 - 品牌推荐师
  • 题解:洛谷 P1099 [NOIP 2007 提高组] 树网的核
  • 闲置支付宝立减金别浪费!合规回收方法来了,新手也能轻松上手 - 可可收
  • Python3教程梳理
  • 题解:洛谷 P5908 猫猫和企鹅
  • 题解:洛谷 P5677 [GZOI2017] 配对统计
  • 2026沸石转轮一体机企业TOP榜:哪些品牌值得关注?催化燃烧/旋风除尘器/除尘器,沸石转轮制造厂家排行榜单 - 品牌推荐师
  • 瑞祥商联卡闲置不用?这样的合规回收方式,新手也能轻松上手 - 可可收
  • 2026年值得推荐的AVIF转WebP在线工具盘点(支持批量转换)
  • 微信立减金回收技巧:47%闲置率下,5招盘活你的“隐形财富” - 可可收
  • 2026年溴化锂中央空调选购指南:值得关注的公司,溴化锂冷水机组/二手溴化锂中央空调,溴化锂中央空调制造企业有哪些 - 品牌推荐师
  • PAM4相关概念
  • 2026年行业内评价高的调节阀厂商如何选,电液动盲板阀/蝶式止回阀/微阻缓闭止回阀/伸缩蝶阀,调节阀生产厂家哪家权威 - 品牌推荐师
  • 2026年中考体育训练新趋势:智慧体育制造企业深度解析,智能运动手环管理平台/握力测试仪,智慧体育生产厂家哪家好 - 品牌推荐师
  • 闲置分期乐购物额度用不上?教你安全高效回收,不浪费一分额度 - 可可收
  • 题解:洛谷 P1631 序列合并
  • 题解:洛谷 P4053 [JSOI2007] 建筑抢修
  • 题解:洛谷 P2161 [SHOI2009] 会场预约
  • 书籍-阿尔伯特·赫尔曼《亚洲古代地理学》
  • IndicEval A Bilingual Indian Educational Evaluation Framework for Large Language Models
  • 2026年上海有实力的宠物口腔医生口碑推荐榜,猫咪牙科/牙科专科/狗狗洗牙/狗口腔溃疡诊疗,宠物口腔医生性价比高的推荐 - 品牌推荐师
  • MultiCW A Large-Scale Balanced Benchmark Dataset for Training Robust Check-Worthiness Detection Mode
  • 题解:洛谷 P3368 【模板】树状数组 2
  • 2026年安徽评价好的家教机构选哪家,大学生家教/小学家教/全托一对一/全托补习班/师范家教/家教,家教机构电话 - 品牌推荐师
  • 题解:洛谷 P3374 【模板】树状数组 1
  • 题解:洛谷 P2085 最小函数值