模板_LCA
2024-08-30 13:02:17
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define maxn 1000002
//#define int long long
//#define kcz
using namespace std;
inline int read()
{
char x = getchar();
int lin = ,f = ;
while(x < '' || x > '')
{
if(x == '-') f = -;
x = getchar();
}
while(x >= '' && x <= '')
{
lin = (lin << ) + (lin << ) + x - '';
x = getchar();
}
return lin * f;
}
#define PII pair<int,int>
#define fir first
#define sec second
#define ma(a,b) make_pair(a,b)
#define inf 123123123
int head[maxn],u,v,tot,n,m,dep[maxn],q,fa[maxn][],rt;
struct st{
int v,nex;
}s[maxn];
void add(int u,int v)
{
s[++tot] = (st) { v,head[u] };
head[u] = tot;
}
void dfs(int now,int F)
{
fa[now][] = F;dep[now]=dep[F]+;
for(int i=;i<=;i++)fa[now][i]=fa[fa[now][i-]][i-];
for(int i = head[now]; i; i = s[i].nex)
if(s[i].v != F)
{
dfs(s[i].v,now);
}
}
int lca(int a,int b)
{
if(dep[a] > dep[b]) swap(a,b);
int len = dep[b] - dep[a];
for(int i = ; ( << i) <= len; i++)
if(len & ( << i))
b = fa[b][i];
if(a != b)
{
for(int i = ; i >= ; i--)
{
if(fa[a][i] != fa[b][i])
{
a = fa[a][i];
b = fa[a][i];
}
}
a = fa[a][];
}
return a;
}
signed main(){
n = read(); q = read(); rt = read();
for(int i = ; i < n; i++)
{
u = read(); v = read();
add(u,v); add(v,u);
}
dfs(rt,);
for(int i = ; i <= q; i++)
{
u = read(); v = read();
printf("%d\n",lca(u,v));
}
}
最新文章
- 【记录】ASP.NET XSS 脚本注入攻击
- SQLServer2008-镜像数据库实施手册(双机)SQL-Server2014同样适用
- Eclipse: The superclass “javax.servlet.http.HttpServlet” was not found on the Java Build Path
- 完全偶图K(3,3)与完全图K5是否存在平面表示
- RHEL 6 或者 Oracle Linux 6, 不关机识别新添加的scsi硬盘
- 认识Runtime2
- 分享jstl实现分页,类似百度分页
- 在Microsoft-IIS/10.0上面部署mvc站点的时候,出现404的错误
- Linux Shell 命令
- ORACLE查看锁(lock)情况
- text code
- WebApi2官网学习记录---单元测试
- jQuery数字加减插件
- JavaEE程序编码规范
- octotree-chrome插件,Github代码阅读神器
- 类和对象,以及 LeetCode 每日一题
- synchronized学习
- I do think I can breakdown the problem into parts that make sense
- 使用My97DatePicker设置日期的属性示例
- TF-IDF算法(1)—算法概述