[学习笔记]lca-倍增
The article is to Jimmy.(方老师讲过了还不会,想怎样???)
The airticle is to Seakway.(我真的打过代码并且讲过了!!!)
求一棵树上两个节点的最近公共祖先有两种算法:
(离线);
倍增(在线).
这篇博客只介绍倍增的写法.
表示节点
的祖先中,与节点
距离为
的节点编号.
那么
每次查询两个节点的
时,现将深度深的点向上移,直到两个点的深度一样.
接下来就重复此工作,直到存在:
找到最小的使得
,如果
,则令
.
(这样的话能保证找到,因为
为公共祖先,
不是公共祖先,那么
会在
到
的路径上,所以需要退一级寻找.)
#include<cmath>
#include<queue>
#include<stack>
#include<cstdio>
#include<vector>
#include<string>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define K 20
#define N 10005
#define M 100005
using namespace std;
struct graph{
int nxt,to;
}e[M];
int f[N][K],g[N],dep[N],m,n,q,cnt;
stack<int> s;
inline void addedge(int x,int y){
e[++cnt].nxt=g[x];g[x]=cnt;e[cnt].to=y;
}
inline void dfs(int u){
dep[u]=;s.push(u);
while(!s.empty()){
u=s.top();s.pop();
if(u!=) for(int i=;i<K;++i)
f[u][i]=f[f[u][i-]][i-];
else for(int i=;i<K;++i)
f[u][i]=u;
for(int i=g[u];i;i=e[i].nxt){
if(!dep[e[i].to]){
dep[e[i].to]=dep[u]+;
f[e[i].to][]=u;
s.push(e[i].to);
}
}
}
}
inline int swim(int x,int h){
for(int i=;h;++i,h>>=)
if(h&) x=f[x][i];
return x;
}
inline int lca(int x,int y){
int i,t;
if(dep[x]<dep[y]){
t=x;x=y;y=t;
}
x=swim(x,dep[x]-dep[y]);
if(x==y) return x;
while(true){
for(i=;f[x][i]!=f[y][i];++i);
if(!i) return f[x][];
x=f[x][i-];y=f[y][i-];
}
}
inline void init(){
scanf("%d%d",&n,&m);
for(int i=,j,k;i<=m;++i){
scanf("%d%d",&j,&k);
addedge(j,k);addedge(k,j);
}
scanf("%d",&q);dfs();
for(int i=,j,k;i<=q;i++){
scanf("%d%d",&j,&k);
printf("%d\n",lca(j,k));
}
}
int main(){
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
init();
fclose(stdin);
fclose(stdout);
return ;
}
[学习笔记]lca-倍增的更多相关文章
- [学习笔记] 树上倍增求LCA
倍增这种东西,听起来挺高级,其实功能还没有线段树强大.线段树支持修改.查询,而倍增却不能支持修改,但是代码比线段树简单得多,而且当倍增这种思想被应用到树上时,它的价值就跟坐火箭一样,噌噌噌地往上涨. ...
- 「学习笔记」倍增思想与lca
目录 ST表 算法 预处理 查询 关于 log2 Code 预处理 查询 例题 P2880 P2048 lca 树上 RMQ 前置知识:欧拉序列 算法 Code 离线 Tarjan 算法 Code 倍 ...
- 算法笔记--lca倍增算法
算法笔记 模板: vector<int>g[N]; vector<int>edge[N]; ][N]; int deep[N]; int h[N]; void dfs(int ...
- 倍增求LCA学习笔记(洛谷 P3379 【模板】最近公共祖先(LCA))
倍增求\(LCA\) 倍增基础 从字面意思理解,倍增就是"成倍增长". 一般地,此处的增长并非线性地翻倍,而是在预处理时处理长度为\(2^n(n\in \mathbb{N}^+)\ ...
- kruskal重构树学习笔记
\(kruskal\) 重构树学习笔记 前言 \(8102IONCC\) 中考到了,本蒟蒻不会,所以学一下. 前置知识 \(kruskal\) 求最小(大)生成树,树上求 \(lca\). 算法详 ...
- Day 4 学习笔记 各种图论
Day 4 学习笔记 各种图论 图是什么???? 不是我上传的图床上的那些垃圾解释... 一.图: 1.定义 由顶点和边组成的集合叫做图. 2.分类: 边如果是有向边,就是有向图:否则,就是无向图. ...
- OI知识点|NOIP考点|省选考点|教程与学习笔记合集
点亮技能树行动-- 本篇blog按照分类将网上写的OI知识点归纳了一下,然后会附上蒟蒻我的学习笔记或者是我认为写的不错的专题博客qwqwqwq(好吧,其实已经咕咕咕了...) 基础算法 贪心 枚举 分 ...
- 【学习笔记】Kruskal 重构树
1. 例题引入:BZOJ3551 用一道例题引入:BZOJ3551 题目大意:有 \(N\) 座山峰,每座山峰有他的高度 \(h_i\).有些山峰之间有双向道路相连,共 \(M\) 条路径,每条路径有 ...
- dsu on tree学习笔记
前言 一次模拟赛的\(T3\):传送门 只会\(O(n^2)\)的我就\(gg\)了,并且对于题解提供的\(\text{dsu on tree}\)的做法一脸懵逼. 看网上的其他大佬写的笔记,我自己画 ...
- 后缀自动机&回文自动机学习笔记
在学了一天其实是边学边摆之后我终于大概$get$后缀自动机了,,,就很感动,于是时隔多年我终于决定再写篇学习笔记辽$QwQ$ $umm$和$FFT$学习笔记一样,这是一篇单纯的$gql$的知识总结博, ...
随机推荐
- 泛型中? super T和? extends T的区别
原文出处: 并发编程网 经常发现有List<? super T>.Set<? extends T>的声明,是什么意思呢?<? super T>表示包括T在内的任何T ...
- IntelliJ IDEA 打包可运行的 JAR
## 构建说明 创建Artifest任务 * File -> Project Structure -> Artifacts -> + JAR* 选择 From module with ...
- WIN7下强制分第四个主分区的方法
通过磁盘管理的界面方式, 第四个分区会被分成扩展分区, 建议通过命令行 打开命令行运行diskpart, list disk 会列出所有磁盘, 选择要操作的磁盘序号如1,select disk 1 如 ...
- java多线程系类:基础篇:08之join
本章,会对Thread中join()方法进行介绍.涉及到的内容包括:1. join()介绍2. join()源码分析(基于JDK1.7.0_40)3. join()示例 转载请注明出处:http:// ...
- noi题库(noi.openjudge.cn) 1.8编程基础之多维数组T11——T20
T11 图像旋转 描述 输入一个n行m列的黑白图像,将它顺时针旋转90度后输出. 输入 第一行包含两个整数n和m,表示图像包含像素点的行数和列数.1 <= n <= 100,1 <= ...
- 关于编写Java程序让Jvm崩溃
今天在书上看到一个作者提出一个问题“怎样通过编写Java代码让Jvm崩溃”,我看了之后也不懂.带着问题查了一下,百度知道里面有这样一个答案: package jvm; public class Cra ...
- intellij idea 高级用法之:集成JIRA、UML类图插件、集成SSH、集成FTP、Database管理
之前写过一篇IntelliJ IDEA 13试用手记,idea还有很多高大上的功能,易用性几乎能与vs.net媲美,反正我自从改用idea后,再也没开过eclipse,今天来看几个高级功能: 一.与J ...
- swifttextfield代理方法
//MARK:textfield delegate //键盘的高度 func textFieldShouldBeginEditing(textField: UITextField) -> Boo ...
- .Net Core 自定义序列化格式
序列化对大家来说应该都不陌生,特别是现在大量使用WEBAPI,JSON满天飞,序列化操作应该经常出现在我们的代码上. 而我们最常用的序列化工具应该就是Newtonsoft.Json,当然你用其它工具类 ...
- [网站公告]3月10日23:00-4:00阿里云SLB升级,会有4-8次连接闪断
大家好,阿里云将于3月10日23:00-4:00对负载均衡服务(SLB)做升级操作,升级期间SLB网络连接会有约4-8次闪断.由此给您带来麻烦,敬请谅解! 阿里云SLB升级公告内容如下: 尊敬的用户: ...