社区讨论
LCA求调
灌水区参与者 5已保存回复 11
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 11 条
- 当前快照
- 1 份
- 快照标识符
- @lxt1dfet
- 此快照首次捕获于
- 2024/06/24 21:51 2 年前
- 此快照最后确认于
- 2024/06/25 11:23 2 年前
rt,自测过,deep数组没问题,但是x总是输出0,求大佬调一下
code:
CPP#include<bits/stdc++.h>
using namespace std;
int n,q,root,k;
int st[500030][20],deep[500030];
vector<int> v[500030];
void count_deep(int x,int father){
deep[x]=deep[father]+1;
st[x][0]=father;
for(int i=1;(1<<i)<=deep[father];i++){
st[x][i]=st[st[x][i-1]][i-1];
}
for(int i=0;i<v[x].size();i++){
count_deep(v[x][i],x);
}
}
int lca(int a,int b){
int x=deep[a],y=deep[b];
if(x!=y){
if(x<y){
swap(a,b);
swap(deep[a],deep[b]);
}
for(int i=0;i<=k;i++){
if((1<<i)!=(a-b)){
a=st[a][i];
}
}
}
if(a==b) return a;
for(int i=k;i>=0;i--){
if(deep[st[a][i]]==0) continue;
if(st[a][i]==st[b][i]) continue;
a=st[a][i],b=st[b][i];
}
return st[a][0];
}
int main(){
cin>>n>>q>>root;
k=log(n)/log(2)+0.5;
for(int i=1;i<n;i++){
int a,b;
cin>>a>>b;
v[b].push_back(a);
}
count_deep(root,0);
while(q--){
int a,b;
cin>>a>>b;
int x=lca(a,b);
cout<<x<<endl;
}
}
回复
共 11 条回复,欢迎继续交流。
正在加载回复...