最近公共祖先(LCA)
主要思路:一个节点的的祖先是那个节点的祖先的的祖先
也就是说
还要计算的值,记录深度
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 5e5 + 10;
int fa[MAXN][30],lg[MAXN],dp[MAXN];
vector<int> ve[MAXN];
void dfs(int son,int dad)
{
fa[son][0] = dad;
dp[son] = dp[dad] + 1;
for(int i = 1;i <= 29;i++) fa[son][i] = fa[fa[son][i - 1]][i - 1];
int end = ve[son].size();
for(int i = 0;i < end;i++)
if(ve[son][i] != dad)
dfs(ve[son][i],son);
}
void flg(int n) {
for(int i = 1;i <= n;i++) lg[i] = lg[i - 1] + (i == (2 << lg[i - 1]));
}
int find(int x,int y)
{
if(dp[x] < dp[y])
swap(x,y);
while(dp[x] != dp[y]) x = fa[x][lg[dp[x]-dp[y]]];
if(x == y) return x;
for(int i = 29;i >= 0;i--) if(fa[x][i] != fa[y][i]) {x = fa[x][i],y = fa[y][i];}
return fa[x][0];
}
int main()
{
ios::sync_with_stdio(false);
int n,m,s;cin >> n >> m >> s;
flg(n);
for(int i = 1;i <= n - 1;i++)
{
int x,y;cin >> x >> y;
ve[x].push_back(y);
ve[y].push_back(x);
}
dfs(s,s);
for(int i = 1;i <= m;i++)
{
int x,y;cin >> x >> y;
cout << find(x,y) << endl;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效