Luogu P3379 【模板】最近公共祖先(LCA)
预处理出从$x$节点向上跳2i个节点的序号$p[x][i]$及节点深度$dpth[x]$,
寻找$lca$时,从$Max$(可能的最大深度)到0枚举$i$,
首先把较深的一个节点向上跳至深度相同,
然后两个点同步动作,若$p[x][i]≠p[y][i]$则跳。
最终返回他们的父亲$p[x][0]$即为$lca$。
注意双向边要开2倍
- #include<cstdio>
- #include<iostream>
- #include<cmath>
- #define MogeKo qwq
- using namespace std;
- const int maxn = *;
- int head[maxn],to[maxn],nxt[maxn],dpth[maxn];
- int n,m,s,u,v,cnt,p[maxn][];
- void add(int x,int y) {
- to[++cnt] = y;
- nxt[cnt] = head[x];
- head[x] = cnt;
- }
- void dfs(int x,int fa) {
- dpth[x] = dpth[fa]+;
- p[x][] = fa;
- for(int i = ; ( << i)<=dpth[x]; i++)
- p[x][i] = p[p[x][i-]][i-];
- for(int i = head[x]; i; i = nxt[i]) {
- if(to[i] == fa)continue;
- dfs(to[i],x);
- }
- }
- int lca(int a,int b) {
- if(dpth[a] < dpth[b])
- swap(a,b);
- for(int i = log2(dpth[a]); i >= ; i--)
- if(dpth[a]-(<<i) >= dpth[b])
- a = p[a][i];
- if(a == b)return a;
- for(int i = log2(dpth[a]);i >= ;i--)
- if(p[a][i] != p[b][i]){
- a = p[a][i];
- b = p[b][i];
- }
- return p[a][];
- }
- int main() {
- scanf("%d%d%d",&n,&m,&s);
- for(int i = ;i <= n-;i++){
- scanf("%d%d",&u,&v);
- add(u,v);
- add(v,u);
- }
- dfs(s,-);
- for(int i = ;i <= m;i++){
- scanf("%d%d",&u,&v);
- int t = lca(u,v);
- printf("%d\n",t);
- }
- return ;
- }
Luogu P3379 【模板】最近公共祖先(LCA)的更多相关文章
- [模板] 最近公共祖先/lca
简介 最近公共祖先 \(lca(a,b)\) 指的是a到根的路径和b到n的路径的深度最大的公共点. 定理. 以 \(r\) 为根的树上的路径 \((a,b) = (r,a) + (r,b) - 2 * ...
- Luogu 2245 星际导航(最小生成树,最近公共祖先LCA,并查集)
Luogu 2245 星际导航(最小生成树,最近公共祖先LCA,并查集) Description sideman做好了回到Gliese 星球的硬件准备,但是sideman的导航系统还没有完全设计好.为 ...
- POJ 1470 Closest Common Ancestors(最近公共祖先 LCA)
POJ 1470 Closest Common Ancestors(最近公共祖先 LCA) Description Write a program that takes as input a root ...
- POJ 1330 Nearest Common Ancestors / UVALive 2525 Nearest Common Ancestors (最近公共祖先LCA)
POJ 1330 Nearest Common Ancestors / UVALive 2525 Nearest Common Ancestors (最近公共祖先LCA) Description A ...
- 【lhyaaa】最近公共祖先LCA——倍增!!!
高级的算法——倍增!!! 根据LCA的定义,我们可以知道假如有两个节点x和y,则LCA(x,y)是 x 到根的路 径与 y 到根的路径的交汇点,同时也是 x 和 y 之间所有路径中深度最小的节 点,所 ...
- 【洛谷 p3379】模板-最近公共祖先(图论--倍增算法求LCA)
题目:给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 解法:倍增. 1 #include<cstdio> 2 #include<cstdlib> 3 #include ...
- 最近公共祖先(LCA)模板
以下转自:https://www.cnblogs.com/JVxie/p/4854719.html 首先是最近公共祖先的概念(什么是最近公共祖先?): 在一棵没有环的树上,每个节点肯定有其父亲节点和祖 ...
- HDU 2586 How far away ?(LCA模板 近期公共祖先啊)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 Problem Description There are n houses in the vi ...
- luogu3379 【模板】最近公共祖先(LCA) 倍增法
题目大意:给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 整体步骤:1.使两个点深度相同:2.使两个点相同. 这两个步骤都可用倍增法进行优化.定义每个节点的Elder[i]为该节点的2^k( ...
- 最近公共祖先lca模板
void dfs(int x,int root){//预处理fa和dep数组 fa[x][0]=root; dep[x]=dep[root]+1; for(int i=1;(1<<i)&l ...
随机推荐
- 微信小程序心得
首先从官方文档给的框架说起,微信小程序官方文档给出了app.js, app.json, app.wxss. 先从这三个文件说起. - app.js 这个文件是整个小程序的入口文件,开发者的逻辑代码在这 ...
- 实现DevOps需要的工具
硬性要求:工具上的准备 代码管理(SCM):GitHub.GitLab.BitBucket.SubVersion 构建工具:Ant.Gradle.maven 自动部署:Capistrano.CodeD ...
- 如何用ABP框架快速完成项目(7) - 用ABP一个人快速完成项目(3) - 通过微服务模式而不是盖楼式来避免难度升级和奥卡姆剃刀原理
这节文章十分重要!十分重要!十分重要! 很多同学在使用ABP的过程中遇到很多问题, 花费了很多时间和精力都还无法解决, 就是卡在这节文章这里. Talk is cheap, just show ...
- iOS--------获取当前连接的WiFi以及IP地址
导入头文件 #import <ifaddrs.h>#import <arpa/inet.h>#import <SystemConfiguration/CaptiveNet ...
- android默认开启adb调试方法分析
用adb调试android时,每次接入usb线,都会提示一个确认打开usb调试功能的窗口,有时候,我们需要默认打开usb调试功能.或者无需弹出对话框,直接默认开启.这个我们需要分析adb的流程了. a ...
- SQL Server中sys.syslogin中updatedate字段的浅析
在系统视图sys.syslogins中,有createdate与updatedate两个字段,分别表示创建登录名与更新登录名的日期,如果你用updatedate的值来判断一个登录名的权限是否被修改过, ...
- linux vbundle插件配置
1.新建目录,clone源码 mkdir ~/.vim/bundle/ git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vun ...
- spring4笔记----报错publicid systemid之间要有空格的解决方法
<?xml version="1.0" encoding="GBK"?> <beans xmlns:xsi="http://www. ...
- shell编程—变量(三)
在shell脚本中,变量分两种,系统变量和自定义变量. 系统默认变量是系统自带的一些变量,如path为路径变量 用户自定义变量为在编写吧脚本的时候自己定义的一些变量 变量名命名规则 首个字符必须为字母 ...
- C#虚函数virtual详解
在面向对象编程中,有两种截然不同的继承方式:实现继承和接口继承.在实现继承时候,在Java中,所有函数默认都是virtual的,而在C#中所有函数并不默认为virtual的,但可以在基类中通过声明关键 ...