社区讨论
TLE求助
P3379【模板】最近公共祖先(LCA)参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mi7rqerq
- 此快照首次捕获于
- 2025/11/21 02:32 4 个月前
- 此快照最后确认于
- 2025/11/21 02:32 4 个月前
CPP
#include<iostream>
#include<stdio.h>
using namespace std;
bool vis[500005];
int depth[500005];
int f[500005][25];
int head[500005];
int n,m,k,i,a,b,x,y;
int size;
struct edges
{
int a,b;
int f;
}edge[1000015];
void add(int a,int b)
{
size++;
edge[size].b=b;
edge[size].f=head[a];
head[a]=size;
}
void init()
{
int j,i;
for (j=1; (1<<j)<=n; j++)
for (i=1; i<=n; i++)
{
f[i][j]=f[f[i][j-1]][j-1];
}
return ;
}
int lca(int x,int y)
{
int i,j;
if (depth[x]>depth[y]) swap(x,y);
for (i=25; i>=0; i--)
{
if (f[y][i]!=0 && depth[f[y][i]]>=depth[x]) y=f[y][i];
}
if (x==y) return x;
for (i=25; i>=0; i--)
if (f[x][i]!=f[y][i] && f[x][i]!=0 && f[y][i]!=0)
{
x=f[x][i];
y=f[y][i];
}
return f[x][0];
}
int dfs(int x,int deep)
{
depth[x]=deep;
int i;
for (i=head[x]; i!=0; i=edge[i].f)
{
if (depth[edge[i].b]==0) {f[edge[i].b][0]=x; dfs(edge[i].b,deep+1);}
}
}
void work()
{
f[k][0]=k;
dfs(k,1);
}
int main()
{
std::ios::sync_with_stdio(0);
cin>>n>>m>>k;
for (i=1; i<=n-1; i++)
{
cin>>a>>b;
add(a,b);
add(b,a);
}
work();
init();
for (i=1; i<=m; i++)
{
cin>>x>>y;
cout<<lca(x,y)<<endl;
}
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...