https://www.luogu.org/problemnew/solution/P3379

LCA叫做最短公共祖先,用来求距离树上两个节点最近的公共点;

常用倍增算法:

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
const int N=1E6+;
long long bits[];
int depth[N],fa[N][];
vector<int >ve[N];
//"---------预处理部分---------"
void inint(){
bits[]=;
for(int i=;i<;i++) bits[i]=bits[i-]<<;//用一个数组记录2的i次幂,每次向上爬满足条件的2的最大i次幂
}
void dfs(int x,int y){//x为子节点,y为父节点
depth[x]=depth[y]+;//子节点与父节点的关系
fa[x][]=y;
//"----核心之一 --"
for(int i=;i<;i++) fa[x][i]=fa[fa[x][i-]][i-];
//"-------"每次向上爬2的i次幂相当于先爬2的i-1次幂,在爬2的i-1次幂
for(int i=;i<ve[x].size();i++){//临接表存图与x相联的点出了子节点就是父节点。将父节点排除掉
int x1=ve[x][i];
if(x1!=y){
dfs(x1,x);//让x做父节点,x1做子节点
}
}
}
//"-----------------------------------"
int lca(int x,int y){//我们规定x为较深的点,y为较浅的一个点
if(depth[x]<depth[y]) swap(x,y);//如果说depth[x]小的话,,要交换一下;
int dif=depth[x]-depth[y];
for(int i=;i>=;i--){
if(dif>=bits[i]){//将X和y变成同一高度。因就相当于将dif用二进制划分,然后记录一下x此时的位置
x=fa[x][i];
dif=dif-bits[i];
}
}
if(x==y) return x;//如果二者相等了说明二者在树枝的同一侧,y就是x的最近的根
for(int i=;i>=;i--){
if(depth[x]>=bits[i]&&fa[x][i]!=fa[y][i]){//找到x和y的根的第一子节点
x=fa[x][i];
y=fa[y][i];
}
}
return fa[x][];//返回自已子节点的父节点,就是公共根了
} int main(){
inint();
int n,m,s;
scanf("%d%d%d",&n,&m,&s);
int x,y;
for(int i=;i<=n-;i++){
scanf("%d%d",&x,&y);
ve[x].push_back(y);
ve[y].push_back(x);
}
dfs(s,);//在这里s是总的根节点,我们规定如果越界,记为0,比如s的父节点就越界了,记录为0;
for(int i=;i<=m;i++){
scanf("%d%d",&x,&y);
printf("%d\n",lca(x,y));
}
return ;
}

LCA基础 附例题(落谷)的更多相关文章

  1. 2-SAT问题学习笔记+例题[洛谷P4792]

    一个不错的2-SAT文章:传送门 问题初入 什么是2-SAT SAT是适定性(Satisfiability)问题的简称 .一般形式为k-适定性问题,简称 k-SAT. 首先,把「2」和「SAT」拆开. ...

  2. Splay伸展树入门(单点操作,区间维护)附例题模板

    Pps:终于学会了伸展树的区间操作,做一个完整的总结,总结一下自己的伸展树的单点操作和区间维护,顺便给未来的自己总结复习用. splay是一种平衡树,[平均]操作复杂度O(nlogn).首先平衡树先是 ...

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

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

  4. JqueryMobile入门基础附源码下载

    最近要做一个手机版的网站,所以就了解了一点JqueryMObile,下面是我整理的笔记,现在分享给大家,希望朋友们喜欢,先给个首页看看吧!!! 一.JqueryMobile基本页面结构 <!DO ...

  5. Socket(TCP)客户端请求和服务端监听和链接基础(附例子)

    一:基础知识回顾 一: Socket 类 实现 Berkeley 套接字接口. Socket(AddressFamily, SocketType,ProtocolType) 使用指定的地址族.套接字类 ...

  6. s - t 平面图最大流 (附例题 bzoj 1001)

    以下均移自 周冬的<两极相通-浅析最大最小定理在信息学竞赛中的应用> 平面图性质 1.(欧拉公式)如果一个连通的平面图有n个点,m条边和f个面,那么f=m-n+2 2.每个平面图G都有一个 ...

  7. [您有新的未分配科技点]数位DP:从板子到基础(例题 bzoj1026 windy数 bzoj3131 淘金)

    只会统计数位个数或者某种”符合简单规律”的数并不够……我们需要更多的套路和应用 数位dp中常用的思想是“分类讨论”思想.下面我们就看一道典型的分类讨论例题 1026: [SCOI2009]windy数 ...

  8. AC日记——组合数问题 落谷 P2822 noip2016day2T1

    题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的定 义,我们可以给出计算 ...

  9. 基础dp例题整理

    背包: 消失之物 先直接做一遍,必然对于i,有 for(j=m;j>=w[i];--j) f[i]+=f[i-w[i]] 所以,如果排除用i做背包的结果,减去这个转移就好了. memcpy(g, ...

随机推荐

  1. python环境变量忘记配置

    Python安装没有勾选配置环境变量安装 解决方法一: 于是,便用安装包卸载后重新安装. 重新安装勾选 安装成功 方法二: 配置环境变量 A.右键点击“我的电脑”,点击“属性”: B.在弹出的界面中点 ...

  2. 图解kubernetes控制器StatefulSet核心实现原理

    StatefulSet是k8s中有状态应用管理的标准实现,今天就一起来了解下其背后设计的场景与原理,从而了解其适用范围与场景 1. 基础概念 首先介绍有状态应用里面的需要考虑的一些基础的事情,然后在下 ...

  3. 【webpack 系列】基础篇

    Webpack 基础篇 基本概念 Webpack 是一个现代 JavaScript 应用程序的静态模块打包器.当 webpack 处理应用程序时,它会递归地构建一个依赖关系图,其中包含应用程序需要的每 ...

  4. 【转】Standardization(标准化)和Normalization(归一化)的区别

    Standardization(标准化)和Normalization(归一化)的区别  https://blog.csdn.net/Dhuang159/article/details/83627146 ...

  5. 本地不安装Oracle时,PLSQL的配置

    这篇我在csdn上写过的,文章地址:https://blog.csdn.net/weixin_40404606/article/details/101940542

  6. iOS mmap

    一.常规文件操作 常规文件操作(read/write)有那几个重要步骤: 进程发起读文件请求 内核通过查找进程文件符表,定位到内核已打开文件集上的文件信息,从而找到此文件的 inode inode 在 ...

  7. D. Little Artem and Dance(带环模拟 + 规律)

    D. Little Artem and Dance Little Artem is fond of dancing. Most of all dances Artem likes rueda - Cu ...

  8. 手工注入——sql server (mssql)注入实战和分析

    前言 首先要对sql server进行初步的了解.常用的全部变量@@version:返回当前的Sql server安装的版本.处理器体系结构.生成日期和操作系统.@@servername:放回运行Sq ...

  9. Hibernate实现limit语句效果

    Hibernate hibernate实现limit效果 由于hql语句内无法直接书写limit语法,所以需要通过别的方式来达成这个效果 limit效果一般需要有两个参数:开始位置start和查询数量 ...

  10. 在.NET Core中检查证书的到期日期

    在 NUnit 测试中,我需要检查证书的有效期. 下面的代码片段可用于使用自定义证书验证回调检查任何证书属性. 所有你需要做的就是在回调中读取你感兴趣的属性,这样你就可以在之后检查它们. DateTi ...