[模板]最近公共祖先LCA
时间:2019-09-21
本文章向大家介绍[模板]最近公共祖先LCA,主要包括[模板]最近公共祖先LCA使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本人水平有限,题解不到为处,请多多谅解
本蒟蒻谢谢大家观看
题目:传送门
倍增求LCA模板
code:
#include<bits/stdc++.h> #pragma GCC optimize(3) using namespace std; int n,q,a,b,tot,m; int nxt[1000010],head[1000010],ver[1000010],dep[1000010],f[1000010][21]; //设f[x,k]表示x的2^k辈祖先,即从x向根节点走2^k步到达的节点 inline int read() { int x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();} return x*f; } void put(int x,int y) { ++tot; ver[tot]=y; nxt[tot]=head[x]; head[x]=tot; } void dfs(int x,int fa)//预处理 深度及到达根节点的步数 { dep[x]=dep[fa]+1;//初始化深度 for(int i=0;i<=19;i++){//或者 i=1;i<=20;i++ f[x][i+1]=f[f[x][i]][i];//f[x][i]=f[f[x][i-1]][i-1] //注意:当i=1 to 20 时 f数组要都要开21,否则会爆零 } for(int i=head[x];i;i=nxt[i]) { int y=ver[i]; if(y==fa)continue; f[y][0]=x; //y向上跳2^0=1就是x,因为y是x的子节点 dfs(y,x); } } int lca(int x,int y) { if(dep[x]<dep[y])//使x深度大于y swap(x,y); for(int i=20;i>=0;i--){//一定要写逆循环 if(dep[f[x][i]]>=dep[y])//把x向上调整到与y同一深度 x=f[x][i]; } if(x==y)//如果在同一分支上,直接输出,因为此时x,y的LCA即本身 return x; for(int i=20;i>=0;i--){ //此时x,y已跳到同一层 if(f[x][i]!=f[y][i]){ //如果f[x][i]和f[y][i]不同才跳,因为相同就表示已经找到根节点 x=f[x][i];//不断更新 y=f[y][i];//不断更新 } } return f[x][0];//当无法在跳时,根节点(父亲节点) 距离字节点只有一步 } int main() { n=read(),q=read(),m=read(); for(int i=1;i<n;i++) { a=read(),b=read(); put(a,b); put(b,a); } dfs(m,0);//以m为根开始遍历 for(int i=1;i<=q;i++) { a=read(),b=read(); printf("%d\n",lca(a,b)); } return 0; }
原文地址:https://www.cnblogs.com/nlyzl/p/11562223.html
- day8、 显示Linux路由表、各列信息
- day9、用户登陆出现-bash-4.1$错误的原因及解决方法
- jboss eap 6.3 域(Domain)模式配置
- 揭穿数据分析的12个神话
- jboss eap 6.3 集群(cluster)配置
- Django中Q查询及Q()对象
- jboss eap 6.3 集群(cluster)-Session 复制(Replication)
- JSP中的Servlet及Filter
- Django ORM详解
- Web前端培训:怎样成长为一个优秀的Web 前端开发工程师?
- Git操作
- 人工智能做的肉,你想吃吗?
- 二、爬虫基础库
- 鱼与熊掌兼得,既要云服务创新也要管理传统网络
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Java单元测试——框架(三)——testNG
- Nginx系列:后端服务应用健康检测
- 那些大厂必问的Handler和Binder,有必要去研究么?
- 欢迎来到 TreeMap 的吐槽大会
- OMG,12 个精致的 Java 字符串操作小技巧,学它
- Nginx系列:安全下载模块
- 5分钟入门GANS:原理解释和keras代码实现
- 使用ML 和 DNN 建模的技巧总结
- 医学图像分割模型U-Net介绍和Kaggle的Top1解决方案源码解析
- 机器学习中的音频特征:理解Mel频谱图
- 兄弟,如何淡定地渡过七夕?
- Spring 源码第 9 篇,深入分析 FactoryBean
- PowerBI 动态数据格式 高级版 以及重要通知
- 气哭老板的顶级密钥存放方案,又做了一件蠢事
- 构建没有数据集的辣辣椒分类器,准确性达到96%