社区讨论
DEV 样例过了,洛谷中 CE 求调
P3379【模板】最近公共祖先(LCA)参与者 5已保存回复 11
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 10 条
- 当前快照
- 1 份
- 快照标识符
- @mlzvhx89
- 此快照首次捕获于
- 2026/02/24 08:34 2 周前
- 此快照最后确认于
- 2026/02/25 19:25 2 周前
CPP
#include <bits/stdc++.h>
using namespace std;
int n,m,S,f[10005][20],d[10005];
vector<int> a[10005];
int lowbit(int x)
{
return x&(-x);
}
dfs(int fr,int x)
{
f[x][0]=fr;
d[x]=d[fr]+1;
for(int i=0;i<a[x].size();i++)
{
int y=a[x][i];
if(y!=fr)
{
dfs(x,y);
}
}
return 0;
}
int up_(int x,int y)
{
while(y>0)
{
x=f[x][int(log2(lowbit(y)))];
y-=lowbit(y);
}
return x;
}
int lca(int x,int y)
{
if(d[x]>d[y])
{
swap(x,y);
}
y=up_(y,d[y]-d[x]);
if(x==y)
{
return x;
}
int t=int(log2(d[x])/log2(2))+1;
while(f[x][0]!=f[y][0])
{
while(f[x][t]==f[y][t])
{
t--;
}
x=f[x][t];
y=f[y][t];
}
return f[x][0];
}
int main()
{
cin >> n >> m >> S;
for(int i=1;i<n;i++)
{
int x,y;
cin >> x >> y;
a[x].push_back(y);
a[y].push_back(x);
}
dfs(0,S);
for(int j=1;j<=int(log2(n)/log2(2));j++)
{
for(int i=1;i<=n;i++)
{
f[i][j]=f[f[i][j-1]][j-1];
}
}
for(int i=1;i<=m;i++)
{
int x,y;
cin >> x >> y;
cout << lca(x,y) << '\n';
}
return 0;
}
回复
共 11 条回复,欢迎继续交流。
正在加载回复...