先暂时把模板写出来,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. 【UR #7】水题走四方 题解

    链接:http://uoj.ac/problem/84 20分算法:萌萌的小爆搜,别搜进环里就行. 50分:我们考虑一下最优决策是什么样的.看似很显然的一点就是我们先让本体在原地不动,让分身去遍历子树 ...

  2. ~~Python解释器安装教程及环境变量配置~~

    进击のpython Python解释器安装教程以及环境变量配置 对于一个程序员来说,能够自己配置python解释器是最基础的技能 那么问题来了,现在市面上有两种Python版本 Python 2.x ...

  3. 【POJ - 1573】Robot Motion

    -->Robot Motion 直接中文 Descriptions: 样例1 样例2 有一个N*M的区域,机器人从第一行的第几列进入,该区域全部由'N' , 'S' , 'W' , 'E' ,走 ...

  4. NOIP2018初赛题解 提高组

  5. 不同版本2.5的Servlet web.xml 头信息

    <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" ...

  6. 自动生成Mybatis的Mapper文件

    自动生成Mybatis的Mapper文件 工作中使用mybatis时我们需要根据数据表字段创建pojo类.mapper文件以及dao类,并且需要配置它们之间的依赖关系,这样的工作很琐碎和重复,myba ...

  7. 用python输出回文数

    一个b站上的朋友问我,怎么返回五位数的回文数的个数. 我首先百度回文数的概念,就是正读和倒读都一样的数字,例如:10001,99899 等等 数字的位数拆分一头雾水,思来想去,用字符串的方法完美解决! ...

  8. Html5web全栈前端开发_angular框架

    昵称领取全套angular视频教程 一.Typescript typescript简称ts,是js语法的超集,很多js新的语法就借鉴了ts语法.ts是由微软团队维护的 1.1 TS简介 1.1.1 G ...

  9. JAVA遍历机制的性能的比较

        本文首发于cartoon的博客     转载请注明出处:https://cartoonyu.github.io/cartoon-blog/post/java/java%E9%81%8D%E5% ...

  10. PHP与ECMAScript_5_常用数组相关函数

    PHP ECMAScript 长度 $length = count($array) length = array.length       增 array_unshift($array, new1,n ...