社区讨论
救我!
P3379【模板】最近公共祖先(LCA)参与者 2已保存回复 12
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 12 条
- 当前快照
- 1 份
- 快照标识符
- @mhjapys4
- 此快照首次捕获于
- 2025/11/03 23:29 4 个月前
- 此快照最后确认于
- 2025/11/04 06:06 4 个月前
哪位善人能帮忙debug一下这段代码?
CPP#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+100,logn=log2(maxn);
vector<int>so[maxn];
int n,m,s,fa[maxn][logn],dp[maxn],lim;
void dfs(int x,int dep){
dp[x]=dep;
for(int i : so[x]) dfs(i,dep+1);
if(!so[x].size()) return;
}
int lca(int x,int y){
if(dp[x]<dp[y]) swap(x,y);
for(int i=lim;i>=0;i--){
if(dp[fa[x][i]]>=dp[y]) x=fa[x][i];
}
if(x==y) return x;
for(int i=lim;i>=0;i--){
if(fa[x][i]!=fa[y][i]){
x=fa[x][i];
y=fa[y][i];
}
}
return fa[x][0];
}
int main(){
scanf("%d%d%d",&n,&m,&s);
lim=log2(n);
for(int i=1,x,y;i<n;i++){
scanf("%d%d",&x,&y);
fa[x][0]=y;
so[y].push_back(x);
for(int j=1;j<=lim;j++) fa[x][j]=fa[fa[x][j-1]][j-1];
}
dfs(s,0);
for(int i=0,a,b;i<m;i++){
scanf("%d%d",&a,&b);
if(a==s||b==s) printf("%d\n",s);
else printf("%d\n",lca(a,b));
}
return 0;
}
非常感谢!(ありがとうございます!)
回复
共 12 条回复,欢迎继续交流。
正在加载回复...