LCA最近公共祖先---倍增法笔记
先暂时把模板写出来,A几道题再来补充
此模板也是洛谷上的一道模板题
P3379 【模板】最近公共祖先(LCA)
#pragma GCC optimize(2) //o2优化
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int L = ;//2的指数的大小
const int NN = 1e6+;
int N,M,S; ll bit[L];
int depth[NN];//depth[i]:节点i在树上的深度
int fa[NN][L]; //fa[i][j]:节点i向上走2^j次方的节点
vector<int> G[NN];//存图 void init_log(){//预先把2的多少次方计算出来
bit[] = ;
for(int i = ;i<L;i++)
bit[i] = bit[i-]*;
} void DFS(int u,int par){//u:当前节点 par:u的父亲节点
depth[u] = depth[par]+;
fa[u][] = par;
for(int i = ;i<L;i++){
fa[u][i] = fa[fa[u][i-]][i-];//计算u的各次方的祖先
}
for(auto v: G[u]){//继续去遍历该节点的孩子节点
if(v!=par){//因为是用邻接表存的,所以需要跳过父亲节点
DFS(v,u);
}
}
} int LCA(int a,int b){
if(depth[a] < depth[b]) swap(a,b);//保证深度大的在前,小的在后
int dif = depth[a] - depth[b];//深度差
for(int i = L-;i>=;i--){
if(bit[i] <= dif){//在不超出深度差的范围向上爬
a = fa[a][i];//爬到的位置
dif -= bit[i];//深度差更新
}
}
//此时a,b已经是相同的深度
if(a == b) return a; //如果a,b节点已经相同,所以a,b所在的节点就是lca for(int i = L-;i>=;i--){
if(bit[i] <= depth[a] && fa[a][i] != fa[b][i]){ //bit[i]<=depth[a]:表示不跳出树之外
a = fa[a][i];
b = fa[b][i];
}
}
return fa[a][]; //返回lca的儿子的父亲,也就是lca
} int main(){
// freopen("test.in","r",stdin);
init_log();
cin>>N>>M>>S;
int u,v;
for(int i = ;i<=N-;i++){ //邻接表存图
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
DFS(S,);
int a,b;
for(int i = ;i<=M;i++){
scanf("%d%d",&a,&b);
int lca = LCA(a,b);
printf("%d\n",lca);
} return ;
}
LCA最近公共祖先---倍增法笔记的更多相关文章
- LCA (最近公共祖先)倍增做法 —— O(nlogn)预处理 O(logn)(在线)查询
pa[a][j] 表示 a 结点的 2^j倍祖先(j = 0时 为直接父亲,j = 1时为父亲的父亲……) 1.首先预处理出所有结点的深度值dep和父亲结点 void dfs(int u, int f ...
- poj1330 lca 最近公共祖先问题学习笔记
首先推荐两个博客网址: http://dongxicheng.org/structure/lca-rmq/ http://scturtle.is-programmer.com/posts/30055. ...
- [模板] LCA-最近公共祖先-倍增法
2019-11-07 09:25:45 C.树之呼吸-叁之型-树上两点路径长度 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 7 (4 ...
- LCA 近期公共祖先 小结
LCA 近期公共祖先 小结 以poj 1330为例.对LCA的3种经常使用的算法进行介绍,分别为 1. 离线tarjan 2. 基于倍增法的LCA 3. 基于RMQ的LCA 1. 离线tarjan / ...
- LCA(最近公共祖先)模板
Tarjan版本 /* gyt Live up to every day */ #pragma comment(linker,"/STACK:1024000000,1024000000&qu ...
- CodeVs.1036 商务旅行 ( LCA 最近公共祖先 )
CodeVs.1036 商务旅行 ( LCA 最近公共祖先 ) 题意分析 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从 ...
- lca 最近公共祖先
http://poj.org/problem?id=1330 #include<cstdio> #include<cstring> #include<algorithm& ...
- Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载)
Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载) 转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2 ...
- LCA近期公共祖先
LCA近期公共祖先 该分析转之:http://kmplayer.iteye.com/blog/604518 1,并查集+dfs 对整个树进行深度优先遍历.并在遍历的过程中不断地把一些眼下可能查询到的而 ...
随机推荐
- NOIP最后阶段每日小记
前言:最后几天了,记录一下每天的经验.教训.启示.大牛路过请补充一点内容…… 2017-10-31 21:32 今天考试打完第一题就知道是AK场,然后就死命搞题,结果第一题手贱多打了一个%,本机无显示 ...
- 查看内存的方法。vs-调试-窗口-内存
1.vs-调试-窗口-内存 2.把指针复制到内存窗口中,就可以查看窗口的内存了.
- python黑帽子学习笔记1:pyqt5 designer+wmi实现进程监视器
环境说明:python3.6 所需要模块:wmi.pyqt5.pythonMagick 先放上一张成品效果图,如图所示: 界面利用pyqt5的designer实现,画好界面如下图所示: 画好后,保存好 ...
- E-R图怎么绘制
E-R图中主要涉及到的元素有: 实体:用长方形表示 关联关系:用菱形表示 属性:用椭圆表示 参考一个例子:
- liunx基本操作操作与文件和目录的管理
一.基本操作 Tab键: 自动补全ctrl + u: 清空至行首ctrl + k: 清空至行尾 ctrl + l: 清屏 ctrl + c: 取消本次命令编辑重启:rebootsystemctl re ...
- 必懂的webpack高级配置
webpack高级配置 1.HTML中img标签的图片资源处理 使用时.只需要在html中正常引用图片即可.webpack就会找到对应的资源进行打包.并修改html中的引用路径 主要是将html中的i ...
- bootstrap-treeview后台Json数据的封装及前台的显示
1.bootStrap-treeview是我们常用的树形结构,页面风格也比较清新,但是后台数据的封装比较麻烦,经过研究终于解决,和大家分享一下. 2.前端代码如下 <script> var ...
- django中通过文件和Ajax来上传文件
一.通过form表单来上传文件 1.在html模板中 <form action="/index/" method="post" enctype=" ...
- TypeError: unbound method
调用类报错,具体如下 TypeError: unbound method submit() must be called with jinjin instance as first argument ...
- 【iOS】Xcode 使用 CocoaPods 导入第三方库后没有提示
Github 上下载的开源项目,运行后出现的 [iOS]build diff: /../Podfile.lock: No such file or directory 解决后,又出现了这个问题. 解决 ...