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, ...
随机推荐
- 第十五周java实验作业
实验十五 GUI编程练习与应用程序部署 实验时间 2018-12-6 1.实验目的与要求 (1) 掌握Java应用程序的打包操作: Java程序的打包,程序编译完成后,程序员将.class文件压缩打 ...
- wr720n v4 折腾笔记(三):网络配置与扩充USB
0x01 前言 网络配置比较简单,但是USB拓展就麻烦许多了,这里由于overlay的内存分配问题导致软件安装失败,这里找到了一种方法就是直接从uboot刷入南浦月大神的wr720n的openwrt固 ...
- 99%的程序员都在用Lombok,原理竟然这么简单?我也手撸了一个!|建议收藏!!!
罗曼罗兰说过:世界上只有一种英雄主义,就是看清生活的真相之后依然热爱生活. 对于 Lombok 我相信大部分人都不陌生,但对于它的实现原理以及缺点却鲜为人知,而本文将会从 Lombok 的原理出发,手 ...
- Linux基础篇学习——文件目录常用管理命令mkdir,cat,more,less,ln,file,cp,find,split,mv
mkdir 创建目录 -p 递归创建目录 -v 显示创建信息 [root@zycentos7 ~]# mkdir -p {mylinux/{bin,conf,lib,logs,webapps/{doc ...
- Android之MVC、MVP、MVVM
本文将详细阐述以下MVC.MVP.MVVM三种理念的定义 MVC MVC全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个 基本部分:模型(Model ...
- OpenCV-Python 使用OCR手写数据集运行KNN | 五十四
目标 在本章中 我们将使用我们在kNN上的知识来构建基本的OCR应用程序. 我们将尝试使用OpenCV自带的数字和字母数据集. 手写数字的OCR 我们的目标是构建一个可以读取手写数字的应用程序.为此, ...
- 【springmvc thymeleaf】springmvc整合thymeleaf
概述 Thymeleaf提供了一组Spring集成,使您可以将其用作Spring MVC应用程序中JSP的全功能替代品. 这些集成将使您能够: @Controller像使用JSP一样,将Spring ...
- Java多线程问题40个
1.多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡.所谓”知其然知其所以然”,”会用”只是”知其然”,”为什么用”才是”知其所以然 ...
- bitset 相关题目
std::bitset 的语法就不搬运了, 直接看题吧 #515. 「LibreOJ β Round #2」贪心只能过样例 题意: 给出 n 个数 \(x_i\), 每个数的取值范围为 \([a ...
- kerberos系列之flink认证配置
大数据安全系列的其它文章 https://www.cnblogs.com/bainianminguo/p/12548076.html-----------安装kerberos https://www. ...