社区讨论
re求救
P3379【模板】最近公共祖先(LCA)参与者 6已保存回复 8
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 8 条
- 当前快照
- 1 份
- 快照标识符
- @mi6nm1um
- 此快照首次捕获于
- 2025/11/20 07:49 4 个月前
- 此快照最后确认于
- 2025/11/20 07:49 4 个月前
本地没re啊
线上全re
CPP#include<iostream>
#include<cstdio>
#define N 500005
using namespace std;
int n,m,root,cntE,cntQ=1,f[N+5],heade[N+5],headq[N+5];
bool vis[N+5];
struct Edge{
int nxt,to;
}edge[N<<1+5];
struct Question{
int nxt,to,LCA;
}question[N<<1+5];
int find(int x){
if(x==f[x])return x;
return f[x]=find(f[x]);
}
void addedge(int u,int v){
edge[++cntE]=(Edge){heade[u],v},heade[u]=cntE;
edge[++cntE]=(Edge){heade[v],u},heade[v]=cntE;
}
void addquestion(int u,int v){
question[++cntQ]=(Question){headq[u],v},headq[u]=cntQ;
question[++cntQ]=(Question){headq[v],u},headq[v]=cntQ;
}
void dfs(int o){
vis[f[o]=o]=1;;
for(int i=heade[o];i;i=edge[i].nxt){
if(!vis[edge[i].to]){
dfs(edge[i].to);
f[edge[i].to]=o;
}
}
for(int i=headq[o];i;i=question[i].nxt){
if(vis[question[i].to]){
question[i^1].LCA=question[i].LCA=find(question[i].to);
}
}
}
int main(){
scanf("%d%d%d",&n,&m,&root);
for(int i=1;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
addedge(x,y);
}
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
addquestion(x,y);
}
dfs(root);
for(int i=1;i<=m;i++)printf("%d\n",question[i<<1].LCA);
return 0;
}
回复
共 8 条回复,欢迎继续交流。
正在加载回复...