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-倍增的更多相关文章

  1. [学习笔记] 树上倍增求LCA

    倍增这种东西,听起来挺高级,其实功能还没有线段树强大.线段树支持修改.查询,而倍增却不能支持修改,但是代码比线段树简单得多,而且当倍增这种思想被应用到树上时,它的价值就跟坐火箭一样,噌噌噌地往上涨. ...

  2. 「学习笔记」倍增思想与lca

    目录 ST表 算法 预处理 查询 关于 log2 Code 预处理 查询 例题 P2880 P2048 lca 树上 RMQ 前置知识:欧拉序列 算法 Code 离线 Tarjan 算法 Code 倍 ...

  3. 算法笔记--lca倍增算法

    算法笔记 模板: vector<int>g[N]; vector<int>edge[N]; ][N]; int deep[N]; int h[N]; void dfs(int ...

  4. 倍增求LCA学习笔记(洛谷 P3379 【模板】最近公共祖先(LCA))

    倍增求\(LCA\) 倍增基础 从字面意思理解,倍增就是"成倍增长". 一般地,此处的增长并非线性地翻倍,而是在预处理时处理长度为\(2^n(n\in \mathbb{N}^+)\ ...

  5. kruskal重构树学习笔记

    \(kruskal\) 重构树学习笔记 前言 \(8102IONCC\) 中考到了,本蒟蒻不会,所以学一下. 前置知识 \(kruskal​\) 求最小(大)生成树,树上求 \(lca​\). 算法详 ...

  6. Day 4 学习笔记 各种图论

    Day 4 学习笔记 各种图论 图是什么???? 不是我上传的图床上的那些垃圾解释... 一.图: 1.定义 由顶点和边组成的集合叫做图. 2.分类: 边如果是有向边,就是有向图:否则,就是无向图. ...

  7. OI知识点|NOIP考点|省选考点|教程与学习笔记合集

    点亮技能树行动-- 本篇blog按照分类将网上写的OI知识点归纳了一下,然后会附上蒟蒻我的学习笔记或者是我认为写的不错的专题博客qwqwqwq(好吧,其实已经咕咕咕了...) 基础算法 贪心 枚举 分 ...

  8. 【学习笔记】Kruskal 重构树

    1. 例题引入:BZOJ3551 用一道例题引入:BZOJ3551 题目大意:有 \(N\) 座山峰,每座山峰有他的高度 \(h_i\).有些山峰之间有双向道路相连,共 \(M\) 条路径,每条路径有 ...

  9. dsu on tree学习笔记

    前言 一次模拟赛的\(T3\):传送门 只会\(O(n^2)\)的我就\(gg\)了,并且对于题解提供的\(\text{dsu on tree}\)的做法一脸懵逼. 看网上的其他大佬写的笔记,我自己画 ...

  10. 后缀自动机&回文自动机学习笔记

    在学了一天其实是边学边摆之后我终于大概$get$后缀自动机了,,,就很感动,于是时隔多年我终于决定再写篇学习笔记辽$QwQ$ $umm$和$FFT$学习笔记一样,这是一篇单纯的$gql$的知识总结博, ...

随机推荐

  1. js物理弹性窗口

    js物理弹性窗口 点击下载代码

  2. shenben语录

    1.别让别人的一句话将你击垮! 2.任何人都不能替你做决定,除了你自己! 3.对于省选: 想去就去,文化课什么的都不是问题. 如果不去,二十年后的自己一定会后悔的.

  3. 条件注释判断浏览器版本<!--[if lt IE 9]>

    <!--[if !IE]><!--> 除IE外都可识别 <!--<![endif]--><!--[if IE]> 所有的IE可识别 <![e ...

  4. [转]分享php中四种webservice实现的简单架构方法及实例

    FROM : http://www.itokit.com/2012/0417/73615_2.html 本人所了解的webservice有以下几种:PHP本身的SOAP,开源的NUSOAP,商业版的P ...

  5. 翻译qmake文档(一) qmake指南和概述

    翻译qmake文档 目录 英文文档连接: http://qt-project.org/doc/qt-5/qmake-manual.html http://qt-project.org/doc/qt-5 ...

  6. Bootstrap系列 -- 2. 标题

    一. Bootstrap标题 在Bootstrap中使用标题和Html本身没有太大的区别使用h1-h6, 而Bootstrap只是默认修改了H1-h6的样式,网上找到如下资料参考 二. Bootstr ...

  7. 网络功能虚拟化(NFV)

    你造什么是网络功能虚拟化(NFV)吗? NFV将网络功能整合到行业标准的服务器.交换机和存储硬件上,提供了优化的虚拟化数据平面,NFV通过服务器上运行的软件让管理员取代传统物理网络设备,并降低成本.能 ...

  8. JavaScript的理解记录(2)

    一.表达式与运算符: 1.对于属性访问表达式: var arr = {first:"hh","second":"gg",third:null ...

  9. 东大oj-1591 Circle of friends

    题目描述 Nowadays, "Circle of Friends" is a very popular social networking platform in WeChat. ...

  10. 虚拟机VirtualBox 5.1.0|VBOX

    Oracle VM VirtualBox是一款免费.开源的虚拟机软件,现属于Oracle旗下产品.可以安装Windows.Linux.IBM OS/2.Solaris.BSD等操作系统,具有远端桌面协 ...