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

最近公共祖先 LCA

最近公共祖先 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);}
};
http://www.hskmm.com/?act=detail&tid=37994

相关文章:

  • QMPlayer2中的类,数据结构
  • QMPlayer2解析
  • 2025年10月广州单位办公室搬家公司全景解析报告,基于专业测评的技术、性能及市场优势深度分析
  • 附加数据文件失败:操作系统错误 5:“5(拒绝访问。)”。 CREATE DATABASE 失败。无法创建列出的某些文件名
  • 书评-谋杀黄昏
  • 20251024- 使用shell脚本分库定时备份MySQL数据
  • 权威调研榜单:东莞工厂装修公司OP3榜单好评深度解析
  • 徐州信息技术服务管理体系认证渠道口碑榜:聚焦机构资质、服务案例及合规性评估
  • 2025年口碑好的FPC离型纸,环氧胶离型纸推荐TOP生产厂家
  • 2025年口碑好的数字地磅,电子汽车衡地磅厂家推荐及选择建议
  • 二分
  • 权威调研榜单:四氟换热器生产厂家TOP3榜单好评深度解析
  • 2025年热门的魔方智能柜,黑金刚智能柜厂家推荐及选择指南
  • 2025年10月扬州公考面试机构全景解析报告,基于专业测评的技术、性能及市场优势深度分析
  • 2025年口碑好的空气能地暖管,德国品牌地暖管厂家最新TOP推荐榜
  • 2025 年企业邮箱供应商品牌最新推荐榜,聚焦技术实力与市场口碑深度解析
  • 2025年上海注册公司/上海代理记账公司最新推荐榜,聚焦企业服务品质与特色业务竞争力深度剖析
  • 2025 年接触角测量仪厂家最新推荐榜:聚焦企业专利技术、品质管控及知名客户合作案例的权威解析
  • 2025 年国内无缝钢管厂家最新推荐榜:20#/Q355 系列 / 合金管优质品牌权威测评及选购指南
  • 2025年诚信的不锈钢网片,304不锈钢网片厂家最新推荐排行榜
  • python type创建类
  • 2025 年伺服压装机生产厂家最新推荐榜:聚焦企业专利技术、品质管控及知名客户合作案例的权威解析
  • 2025年正规的PE防撞碳晶板,ABS防撞碳晶板推荐TOP生产厂家
  • 轻量化 vs 定制化:不同规模企业如何选择 MyEMS 部署模式?
  • 2025年优秀的冷却塔,鼓风式冷却塔定制定做
  • 2025年比较好的车铣复合机床,动力刀塔车铣复合品牌厂家排行榜
  • ISCSI技术原理与运维实践指南
  • 2025年质量好的防火风管加工,角钢风管加工厂家推荐及选择建议
  • 2025 年板材厂家最新推荐排行榜:胖胖熊等优质企业综合实力解析与选购参考
  • 2025年优秀的手动喷砂机,通过式喷砂机最新TOP厂家推荐