最近公共祖先(LCA)模板
第一行包含三个正整数N、M、S,分别表示树的结点个数、询问的个数和树根结点的序号。
接下来N-1行每行包含两个正整数x、y,表示x结点和y结点之间有一条直接连接的边(数据保证可以构成树)。
接下来M行每行包含两个正整数a、b,表示询问a结点和b结点的最近公共祖先。
输出格式:
输出包含M行,每行包含一个正整数,依次为每一个询问的结果。
输入样例#1:
5 5 4
3 1
2 4
5 1
1 4
2 4
3 2
3 5
1 2
4 5
输出样例#1:
4
4
1
4
4
模板:时间复杂度nlogn
#include<iostream>
#include<cstdio>
using namespace std;
struct yyy{
int t,
nex;
}e[ * ];
int deepth[], fa[][], lg[], head[];
int tot;
void add(int x, int y) //邻接表存树
{
e[++tot].t = y;
e[tot].nex = head[x];
head[x] = tot;
}
void dfs(int f, int fath)
{
deepth[f] = deepth[fath] + ;
fa[f][] = fath;
for (int i = ; ( << i) <= deepth[f]; i++)
fa[f][i] = fa[fa[f][i - ]][i - ];
for (int i = head[f]; i; i = e[i].nex)
if (e[i].t != fath)
dfs(e[i].t, f);
}
int lca(int x, int y)
{
if (deepth[x]<deepth[y])
swap(x, y);
while (deepth[x]>deepth[y])
x = fa[x][lg[deepth[x] - deepth[y]] - ];
if (x == y)
return x;
for (int k = lg[deepth[x]]; k >= ; k--)
if (fa[x][k] != fa[y][k])
x = fa[x][k], y = fa[y][k];
return fa[x][];
}
int n, m, s;//n节点,m查询,s边数
void init()
{
scanf("%d%d%d", &n, &m, &s);
for (int i = ; i <= n - ; i++)
{
int x, y; scanf("%d%d", &x, &y);
add(x, y); add(y, x);
}
dfs(s, );
for (int i = ; i <= n; i++)
lg[i] = lg[i - ] + ( << lg[i - ] == i);
} int main()
{
init();
for (int i = ; i <= m; i++)
{
int x, y; scanf("%d%d", &x, &y);
printf("%d\n", lca(x, y));
} return ;
}
最近公共祖先(LCA)模板的更多相关文章
- 最近公共祖先(LCA)模板
以下转自:https://www.cnblogs.com/JVxie/p/4854719.html 首先是最近公共祖先的概念(什么是最近公共祖先?): 在一棵没有环的树上,每个节点肯定有其父亲节点和祖 ...
- 最近公共祖先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 ...
- [模板] 最近公共祖先/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 之间所有路径中深度最小的节 点,所 ...
- lca最近公共祖先(模板)
洛谷上的lca模板题--传送门 学了求lca的tarjan算法(离线),在洛谷上做模板题,结果后三个点超时. 又把询问改成链式前向星,才ok. 这个博客,tarjan分析的很详细. 附代码-- #in ...
- LCA最近公共祖先——Tarjan模板
LCA(Lowest Common Ancestors),即最近公共祖先,是指在有根树中,找出某两个结点u和v最近的公共祖先. Tarjan是一种离线算法,时间复杂度O(n+Q),Q表示询问次数,其中 ...
- luogu3379 【模板】最近公共祖先(LCA) 倍增法
题目大意:给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 整体步骤:1.使两个点深度相同:2.使两个点相同. 这两个步骤都可用倍增法进行优化.定义每个节点的Elder[i]为该节点的2^k( ...
随机推荐
- 安装searchd
把安装包解压到 D:coreseek 创建表 create table product( id int key auto_increment, title ), content text ); ins ...
- 前端迷思与React.js
前端迷思与React.js 前端技术这几年蓬勃发展, 这是当时某几个项目需要做前端技术选型时, 相关资料整理, 部分评论引用自社区. 开始吧: 目前, Web 开发技术框架选型为两种的占 80% .这 ...
- c# 对Url 解码编码
/// <summary> /// 对Url进行编码 /// </summary> /// <param name="url">url</ ...
- 通向全栈之路(6)—无密码ssh连接
(1)在用户目录下新增一个 .ssh文件 mkdir .ssh (2)生成公钥.私钥 ssh-keygen -t rsa -b 4096 -C "mail@xxx.com" (3) ...
- 外边距塌陷 margin collapsing
块的顶部外边距和底部外边距有时被组合(折叠)为单个外边距,其大小是组合到其中的最大外边距, 这种行为称为外边距塌陷(margin collapsing),有的地方翻译为外边距合并. 1.相邻的兄弟姐妹 ...
- Csharp: read Sybase SQL anywhere5.5 using c#
private void button1_Click(object sender, EventArgs e) { try { //OdbcConnection conn = new OdbcConne ...
- webpack单独打包一个less文件
需要将btn.less文件用webpack打包后,放到项目中.在网上百度了各种,遇到了很多问题,现在我将整个步骤整理如下: 1.建一个空的文件夹,命名为init_webpack,在该文件夹下运行: 这 ...
- 【读书笔记】iOS-音频设备访问
音频的输入是通过麦克风实现,音频的输出是通过扬声气实现的.在iOS系统中无法直接操控麦克风和扬声器,苹果提供了丰富的音频API. 一,音频API介绍 在iOS和Mac OS X上开发音频应用,主要有两 ...
- ArcGIS Portal与Adapter安装问题
1. WIN2008R2 80端口被system占用解决办法 修改注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP右侧的star ...
- Oracle 中 流程控制函数 decode用法
函数介绍 DECODE函数是ORACLE PL/SQL的功能强大的函数之一,目前还只有ORACLE公司的SQL提供了此函数,其它数据库厂商的SQL实现还没有此功能. DECODE有什么用途呢?先构造一 ...