社区讨论
LCA求助
学术版参与者 4已保存回复 7
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 7 条
- 当前快照
- 1 份
- 快照标识符
- @lymasbmc
- 此快照首次捕获于
- 2024/07/15 09:20 2 年前
- 此快照最后确认于
- 2024/07/15 10:23 2 年前
rt,大佬们为啥我样例后面几个输不出来 (大雾)
CPP#include<bits/stdc++.h>
using namespace std;
const int N=5e5+100;
int n,m,s;
//int a[N*4];
int pre[N*5];
int k=1;
struct re{
int to,next;
}a[N*5];
void add(int u,int v){
a[k].to=v;
a[k].next=pre[u];
pre[u]=k;
k++;
}
int f[N][21];
int deep[N*4];
void dfs(int x){
for(int i=pre[x];i!=0;i=a[i].next){
if(a[i].to!=f[x][0]){
f[a[i].to][0]=x;
deep[a[i].to]=deep[x]+1;
dfs(a[i].to);
}
}
}
int lca(int x,int y){
if(deep[x]<deep[y])swap(x,y);
for(int i=20;i>=0;i--){
if(deep[x]-i*2>=deep[y]){
x=f[x][i];
}
}
if(x==y) return x;
for(int i=20;i>=0;i--){
if(f[x][i]!=f[y][i]){
x=f[x][i];
y=f[y][i];
}
}
return f[x][0];
}
int main(){
cin>>n>>m>>s;
for(int i=1;i<n;i++){
int x,y;
cin>>x>>y;
add(x,y);
add(y,x);
}
dfs(s);
for(int j=1;j<=20;j++){
for(int i=1;i<=n;i++){
f[i][j]=f[f[i][j-1]][j-1];
}
}
while(m--){
int x,y;
cin>>x>>y;
cout<<lca(x,y)<<'\n';
}
return 0;
}
(悬)拜托了
回复
共 7 条回复,欢迎继续交流。
正在加载回复...