尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

最近公共祖先 LCA

最近公共祖先 LCA
📅 发布时间:2026/6/20 13:32:43

最近公共祖先 LCA

树链剖分解法

预处理时间复杂度 \(\mathcal O(N)\) ;单次查询 \(\mathcal O(\log N)\) ,常数较小。

struct HLD {int n, idx;vector<vector<int>> ver;vector<int> siz, dep;vector<int> top, son, parent;HLD(int n) {this->n = n;ver.resize(n + 1);siz.resize(n + 1);dep.resize(n + 1);top.resize(n + 1);son.resize(n + 1);parent.resize(n + 1);}void add(int x, int y) { // 建立双向边ver[x].push_back(y);ver[y].push_back(x);}void dfs1(int x) {siz[x] = 1;dep[x] = dep[parent[x]] + 1;for (auto y : ver[x]) {if (y == parent[x]) continue;parent[y] = x;dfs1(y);siz[x] += siz[y];if (siz[y] > siz[son[x]]) {son[x] = y;}}}void dfs2(int x, int up) {top[x] = up;if (son[x]) dfs2(son[x], up);for (auto y : ver[x]) {if (y == parent[x] || y == son[x]) continue;dfs2(y, y);}}int lca(int x, int y) {while (top[x] != top[y]) {if (dep[top[x]] > dep[top[y]]) {x = parent[top[x]];} else {y = parent[top[y]];}}return dep[x] < dep[y] ? x : y;}int clac(int x, int y) { // 查询两点间距离return dep[x] + dep[y] - 2 * dep[lca(x, y)];}void work(int root = 1) { // 在此初始化dfs1(root);dfs2(root, root);}
};

树上倍增解法

预处理时间复杂度 \(\mathcal O(N\log N)\) ;单次查询 \(\mathcal O(\log N)\) ,但是常数比树链剖分解法更大。

封装一:基础封装,针对无权图。

struct Tree {int n;vector<vector<int>> ver, val;vector<int> lg, dep;Tree(int n) {this->n = n;ver.resize(n + 1);val.resize(n + 1, vector<int>(30));lg.resize(n + 1);dep.resize(n + 1);for (int i = 1; i <= n; i++) { //预处理 loglg[i] = lg[i - 1] + (1 << lg[i - 1] == i);}}void add(int x, int y) { // 建立双向边ver[x].push_back(y);ver[y].push_back(x);}void dfs(int x, int fa) {val[x][0] = fa; // 储存 x 的父节点dep[x] = dep[fa] + 1;for (int i = 1; i <= lg[dep[x]]; i++) {val[x][i] = val[val[x][i - 1]][i - 1];}for (auto y : ver[x]) {if (y == fa) continue;dfs(y, x);}}int lca(int x, int y) {if (dep[x] < dep[y]) swap(x, y);while (dep[x] > dep[y]) {x = val[x][lg[dep[x] - dep[y]] - 1];}if (x == y) return x;for (int k = lg[dep[x]] - 1; k >= 0; k--) {if (val[x][k] == val[y][k]) continue;x = val[x][k];y = val[y][k];}return val[x][0];}int clac(int x, int y) { // 倍增查询两点间距离return dep[x] + dep[y] - 2 * dep[lca(x, y)];}void work(int root = 1) { // 在此初始化dfs(root, 0);}
};

封装二:扩展封装,针对有权图,支持“倍增查询两点路径上的最大边权”功能。

struct Tree {int n;vector<vector<int>> val, Max;vector<vector<pair<int, int>>> ver;vector<int> lg, dep;Tree(int n) {this->n = n;ver.resize(n + 1);val.resize(n + 1, vector<int>(30));Max.resize(n + 1, vector<int>(30));lg.resize(n + 1);dep.resize(n + 1);for (int i = 1; i <= n; i++) { //预处理 loglg[i] = lg[i - 1] + (1 << lg[i - 1] == i);}}void add(int x, int y, int w) { // 建立双向边ver[x].push_back({y, w});ver[y].push_back({x, w});}void dfs(int x, int fa) {val[x][0] = fa;dep[x] = dep[fa] + 1;for (int i = 1; i <= lg[dep[x]]; i++) {val[x][i] = val[val[x][i - 1]][i - 1];Max[x][i] = max(Max[x][i - 1], Max[val[x][i - 1]][i - 1]);}for (auto [y, w] : ver[x]) {if (y == fa) continue;Max[y][0] = w;dfs(y, x);}}int lca(int x, int y) {if (dep[x] < dep[y]) swap(x, y);while (dep[x] > dep[y]) {x = val[x][lg[dep[x] - dep[y]] - 1];}if (x == y) return x;for (int k = lg[dep[x]] - 1; k >= 0; k--) {if (val[x][k] == val[y][k]) continue;x = val[x][k];y = val[y][k];}return val[x][0];}int clac(int x, int y) { // 倍增查询两点间距离return dep[x] + dep[y] - 2 * dep[lca(x, y)];}int query(int x, int y) { // 倍增查询两点路径上的最大边权(带权图)auto get = [&](int x, int y) -> int {int ans = 0;if (x == y) return ans;for (int i = lg[dep[x]]; i >= 0; i--) {if (dep[val[x][i]] > dep[y]) {ans = max(ans, Max[x][i]);x = val[x][i];}}ans = max(ans, Max[x][0]);return ans;};int fa = lca(x, y);return max(get(x, fa), get(y, fa));}void work(int root = 1) { // 在此初始化dfs(root, 0);}
};

相关新闻

  • 题解:P3343 [ZJOI2015] 地震后的幻想乡
  • 暂存:P14214 [COI 2010] 圆圈 / KOLO
  • QMPlayer2解析

最新新闻

  • 2026 年 6 月最新资讯:萧邦国内全部官方维修门店地址全面更新公示,专属全国服务热线同步上线运行 - 亨得利中国服务中心
  • 卡地亚 2026 年 6 月全国官方维修网点实地调研验证报告:统一服务流程全面更新,专属售后体验迎来系统性全新升级 - 卡地亚中国服务中心
  • Onekey Steam清单下载器:轻松获取游戏清单的完整指南
  • 像素字体实战指南:从入门到精通的3个核心技巧
  • Claude Code 使用 GPT-5.5:2026年国内直连全球AI大模型
  • 2026 年 6 月帝舵售后核验最新完整版报告|中国区域新增多处钟表维修网点,全新服务场地正式投入使用 - 亨得利中国服务中心

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号