先暂时把模板写出来,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最近公共祖先---倍增法笔记的更多相关文章

  1. LCA (最近公共祖先)倍增做法 —— O(nlogn)预处理 O(logn)(在线)查询

    pa[a][j] 表示 a 结点的 2^j倍祖先(j = 0时 为直接父亲,j = 1时为父亲的父亲……) 1.首先预处理出所有结点的深度值dep和父亲结点 void dfs(int u, int f ...

  2. poj1330 lca 最近公共祖先问题学习笔记

    首先推荐两个博客网址: http://dongxicheng.org/structure/lca-rmq/ http://scturtle.is-programmer.com/posts/30055. ...

  3. [模板] LCA-最近公共祖先-倍增法

    2019-11-07 09:25:45 C.树之呼吸-叁之型-树上两点路径长度 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 7 (4 ...

  4. LCA 近期公共祖先 小结

    LCA 近期公共祖先 小结 以poj 1330为例.对LCA的3种经常使用的算法进行介绍,分别为 1. 离线tarjan 2. 基于倍增法的LCA 3. 基于RMQ的LCA 1. 离线tarjan / ...

  5. LCA(最近公共祖先)模板

    Tarjan版本 /* gyt Live up to every day */ #pragma comment(linker,"/STACK:1024000000,1024000000&qu ...

  6. CodeVs.1036 商务旅行 ( LCA 最近公共祖先 )

    CodeVs.1036 商务旅行 ( LCA 最近公共祖先 ) 题意分析 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从 ...

  7. lca 最近公共祖先

    http://poj.org/problem?id=1330 #include<cstdio> #include<cstring> #include<algorithm& ...

  8. Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载)

    Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载) 转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2 ...

  9. LCA近期公共祖先

    LCA近期公共祖先 该分析转之:http://kmplayer.iteye.com/blog/604518 1,并查集+dfs 对整个树进行深度优先遍历.并在遍历的过程中不断地把一些眼下可能查询到的而 ...

随机推荐

  1. java截取避免空字符丢失

    1. 场景描述 数据后端是Hbase等nosql数据库,返回的数据以逗号分隔,java后端获取数据后,需要新增组装数据后再返回给前端. 2. 问题解决 2.1 问题定位 本来用的java的split进 ...

  2. Java编程思想:一个小小的控制框架

    这个实验我很喜欢,学到了非常多的东西: import java.util.ArrayList; import java.util.List; public class Test { public st ...

  3. UVA1327 && POJ1904 King's Quest(tarjan+巧妙建图+强连通分量+缩点)

    UVA1327 King's Quest POJ1904 King's Quest 题意: 有n个王子,每个王子都有k个喜欢的妹子,每个王子只能和喜欢的妹子结婚.现有一个匹配表,将每个王子都与一个自己 ...

  4. .netcore微服务-Mycat

      1.前言 1.1  分布式数据库 随着IT行业的迅猛发展,行业应用系统的数据规模呈现爆炸式增长,对数据库的数据处理能力要求越来越高,分布式数据库正是因此应运而生. 分布式数据库特点包括: 透明性: ...

  5. python 2.7 - 3.5 升级之路 (二) : 语法与类库升级

    背景 在上一篇博文中,我们为升级python 2 -> 3已经做了一些准备.在这篇中,我们将针对语法与类库这两个方面进行讨论. 关于语法 1. print 在python3中, print 已经 ...

  6. Atom实用插件

    下载atom狠戳本链接 中文简体插件(工具栏,右键菜单,设置菜单) simplified-chinese-menu 代码格式化插件(支持多种语言) atom-beautify 智能补全资源路径插件 a ...

  7. Quartus ii调试技巧_01

    前几天李主任跟我分享了一些特别好用的调试技巧: 1)System Sources and Probes Editor---类似于人为设置触发条件,创建虚拟按键等功能,这段时间一直在做一个电机的驱动,板 ...

  8. PHP语句中or的用法

     经常看到这样的语句: $file = fopen($filename, 'r') or die("抱歉,无法打开: $filename"); or在这里是这样理解的,因为在P ...

  9. WebRTC:会话描述协议SDP

    什么是SDP SDP(Session Description Protocol)是一种通用的会话描述协议,主要用来描述多媒体会话,用途包括会话声明.会话邀请.会话初始化等. WebRTC主要在连接建立 ...

  10. 渐进式web应用开发-- 使用后台同步保证离线功能(六)

    _ 阅读目录 一:什么是后台同步保证离线功能呢? 二:后台同步是如何实现的呢? 三:如何给sync事件传递数据? 四:在我们的项目中添加后台同步功能 回到顶部 一:什么是后台同步保证离线功能呢? 在我 ...