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

LCA

LCA

最近公共祖先之倍增法

倍增我们一般通用两种方法。比如,如果我们需要用二的次方凑出25这个数字时,就可能是。1->2->4->8->8->2或者是1->8->16。

那么,我们其实更加倾向于使用第二种方法。因为第一种适用于不固定长度的k。而第二种则更加倾向于固定长度的k。

同时我们可以发现第一种的时间是O(2 * logn),第二种的时间就是O(k),显然第二种才是上上册。

然后我们在求最近的公共祖先时,如果暴力,让a,b一个一个跳的话时间是O(n)的。只能解决一小部分问题,所以倍增诞生了。

我们定义:\(dp_{x,i}\) 表示编号是 \(x\) 的点向上跳 \(2^i\) 步的节点的编号是什么。那么方程应该是什么呢?

其实很好求,当前节点跳 \(2^{i - 1}\) 时再跳 \(2^{i - 1}\) 是不是就等于 \(2^i\) 那么我们可以得知方程是:

dp[x][i] = dp[dp[x][i - 1]][i - 1];

那么接下来就十分好求了,首先你要使他们的深度保持一致。那么就是只要dep[dp[x][i]] >= dep[y]

那么我们就让x向上跳 \(dp[x][i]\) 个节点。毕竟要它两深度一样也不能不用倍增啊(否则在特殊情况下就我们的倍增形同虚设)。

然后,要注意因为我们每次倍增使看跳了后相不相等,且最后的答案肯定使 \(dp_{x,0}\) 因为我们只要中间的距离大于1,我们都是可以跳的。

所以最后我们肯定是输出 \(x\) 的父亲,但是,问题出现了。如果在我们将深度变成一致时刚好两个点相等。

也就是一个点就是另一个点的祖先。那么我们就会输出错误的答案,所以我们要特判一下这种情况。

code

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,s;
vector<int>E[500005];
int dep[500005];
int dp[500005][25];
void dfs(int u,int fa){dp[u][0] = fa;for(int i = 1 ; i <= 20 ; i ++){dp[u][i] = dp[dp[u][i - 1]][i - 1];}for(int i = 0 ; i < E[u].size() ; i ++){int v = E[u][i];if(v != fa){dep[v] = dep[u] + 1;dfs(v , u);}}return ;
}
int lca(int x,int y){if(dep[x] < dep[y]){swap(x , y);}for(int i = 20; i >= 0 ; i --){if(dep[dp[x][i]] >= dep[y]){x = dp[x][i];}} if(x == y){return x;}for(int i = 20 ; i >= 0 ; i --){if(dp[x][i] != dp[y][i]){x = dp[x][i];y = dp[y][i];}}return dp[x][0];
}
signed main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin >> n >> m >> s;for(int i = 1 ; i < n ; i ++){int u,v;cin >> u >> v;E[u].push_back(v);E[v].push_back(u);}dep[s] = 1;dfs(s , 0);while(m --){int a,b;cin >> a >> b;cout << lca(a , b) << endl;}return 0;
}
http://www.hskmm.com/?act=detail&tid=34880

相关文章:

  • 【测试分类 (下)】测试分类看这篇就够了:彻底告别概念混淆,轻松搞定工作面试 - 指南
  • 树状数组
  • 如何管控文件外发安全,确保企业数据不被泄露
  • 打通CI/CD最后一公里:制品库如何成为高效流水线的核心枢纽
  • 2025年10月高端奢侈家电品牌推荐排行榜及深度对比分析
  • 嵌入式调式方案:
  • 2025年10月高端奢侈家电品牌推荐排行榜对比与深度评测分析
  • 2025年GEO品牌推荐排行榜前十强权威发布
  • 2025年GEO品牌推荐榜与排行榜Top10:权威解析与行业洞察
  • 2025年10月高端奢侈家电品牌推荐排行榜单对比与评测分析
  • 第五章 linux实战-CMS01
  • 字典树
  • 2025年10月高端奢侈家电品牌推荐排行榜:五大品牌综合对比与选购指南
  • mysql 更新默认时间
  • A. Vasya and Petyas Game
  • Android Studio Archive | Android Studio 归档下载
  • 关系型数据库的基本理论
  • JAVA集合
  • 【最新推荐】分享十大常用又靠谱的文件摆渡系统
  • C语言实现LDPC码译码功能
  • 2025年10月中国试验机厂家推荐:十强榜单对比与性能评测
  • [NOIP 2012 提高组] 开车旅行 的AC代码
  • Voice Chat: Resolving Lag and Stuttering with a Jitter Buffer
  • 2025 年报警器经销商最新推荐榜单:全面剖析海湾、青鸟等品牌服务商优势,为您筛选优质可靠合作伙伴燃气 / 太阳能 / 交通道路报警器推荐
  • 结构体
  • 专栏导航:《数据中心网络与异构计算:从瓶颈突破到架构革命》 - 实践
  • 扫描线总结
  • 2025年10月抗老面霜推荐:小鸟传领衔五强对比评测榜
  • 基于STM32芯片通过CAN总线控制电机运动
  • 2025 酒店家具厂家最新推荐榜:北木斋领衔五大新锐品牌,品质与创新双优之选全解析