LCA基础 附例题(落谷)
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基础 附例题(落谷)的更多相关文章
- 2-SAT问题学习笔记+例题[洛谷P4792]
一个不错的2-SAT文章:传送门 问题初入 什么是2-SAT SAT是适定性(Satisfiability)问题的简称 .一般形式为k-适定性问题,简称 k-SAT. 首先,把「2」和「SAT」拆开. ...
- Splay伸展树入门(单点操作,区间维护)附例题模板
Pps:终于学会了伸展树的区间操作,做一个完整的总结,总结一下自己的伸展树的单点操作和区间维护,顺便给未来的自己总结复习用. splay是一种平衡树,[平均]操作复杂度O(nlogn).首先平衡树先是 ...
- 倍增求LCA学习笔记(洛谷 P3379 【模板】最近公共祖先(LCA))
倍增求\(LCA\) 倍增基础 从字面意思理解,倍增就是"成倍增长". 一般地,此处的增长并非线性地翻倍,而是在预处理时处理长度为\(2^n(n\in \mathbb{N}^+)\ ...
- JqueryMobile入门基础附源码下载
最近要做一个手机版的网站,所以就了解了一点JqueryMObile,下面是我整理的笔记,现在分享给大家,希望朋友们喜欢,先给个首页看看吧!!! 一.JqueryMobile基本页面结构 <!DO ...
- Socket(TCP)客户端请求和服务端监听和链接基础(附例子)
一:基础知识回顾 一: Socket 类 实现 Berkeley 套接字接口. Socket(AddressFamily, SocketType,ProtocolType) 使用指定的地址族.套接字类 ...
- s - t 平面图最大流 (附例题 bzoj 1001)
以下均移自 周冬的<两极相通-浅析最大最小定理在信息学竞赛中的应用> 平面图性质 1.(欧拉公式)如果一个连通的平面图有n个点,m条边和f个面,那么f=m-n+2 2.每个平面图G都有一个 ...
- [您有新的未分配科技点]数位DP:从板子到基础(例题 bzoj1026 windy数 bzoj3131 淘金)
只会统计数位个数或者某种”符合简单规律”的数并不够……我们需要更多的套路和应用 数位dp中常用的思想是“分类讨论”思想.下面我们就看一道典型的分类讨论例题 1026: [SCOI2009]windy数 ...
- AC日记——组合数问题 落谷 P2822 noip2016day2T1
题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的定 义,我们可以给出计算 ...
- 基础dp例题整理
背包: 消失之物 先直接做一遍,必然对于i,有 for(j=m;j>=w[i];--j) f[i]+=f[i-w[i]] 所以,如果排除用i做背包的结果,减去这个转移就好了. memcpy(g, ...
随机推荐
- VIM不正常退出产生的swp文件
VIM不正常退出产生的swp文件 当你非正常关闭vim编辑器时(比如直接关闭终端或者电脑断电),会生成一个.swp文件,这个文件是一个临时交换文件,用来备份缓冲区中的内容. 第一次产生的交换文件名为“ ...
- C# 基础知识系列- 4 面向对象
面向对象 面向对象是一个抽象的概念,其本质就是对事物以抽象的方式建立对应的模型. 简单来讲,比如我有一只钢笔,那么我就可以通过分析,可以得到 这只钢笔的材第是塑料,品牌是个杂牌 ,里面装的墨是黑色的, ...
- 解决在linux下的eclipse syso Alt+/无法使用
1.绑定快捷键 2.配置proposal
- pycharm创建虚拟环境venv和添加依赖库package
1.创建虚拟环境 因为项目采用不同版本的python,所依赖的库的版本也不一样,为了避免版本冲突,为每一个项目每个python版本创建一个虚拟环境,环境中所使用的依赖库也是独立存在,不会被其他版本或其 ...
- 七大Github机器学习热门项目
译者 | 小韩 来源 | analyticsvidhya.com[磐创AI导读]:让我们一起来看下近期热门的机器学习Github仓库,包括了自然语言处理(NLP).计算机视觉(CV)与大数据等多个领域 ...
- ATM 最初版
# 二 一个项目开发前,有一份开发文档 # # 项目: 编写小说阅读程序实现下属功能 # # # 一:程序运行开始时显示 # 0 账号注册 # 1 账号登录 # 2 充值功能 # 3 阅读小说 imp ...
- WeChat-SmallProgram:组件 scroll-view 横向和纵向 案例
scroll-view为滚动视图,分为水平滚动和垂直滚动.注意滚动视图垂直滚动时一定要设置高度否则的话scroll-view不会生效. 滚动视图常用的地方一般都是Item项比较多的界面,比如我的模块 ...
- Cygwin工具编译Ardupilot方法
注意:该编译方法生成的固件基于Chibios系统,如果想要Nuttx系统固件,需采用make编译,步骤见make编译说明部分. 软件安装准备 安装Cygwin 打开链接www.cygwin.com/i ...
- python 开发工具简介
一.python 开发工具简介 1.IDLE IDLE是开发python程序的基本IDE(集成开发环境),具备基本的IDE的功能,是非商业Python开发的不错的选择.当安装好python以后,IDL ...
- 音视频开发-FFmpeg
音视频开发是个非常复杂的,庞大的开发话题,初涉其中,先看一下结合 OEIP(开源项目) 新增例子. 可以打开flv,mp4类型文件,以及rtmp协议音视频数据,声音的播放使用SDL. 把采集的麦/声卡 ...