社区讨论
求大佬讲解
P3379【模板】最近公共祖先(LCA)参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @m42revf1
- 此快照首次捕获于
- 2024/11/29 21:08 去年
- 此快照最后确认于
- 2024/11/29 21:19 去年
暴力.用fa是否被标记判断节点是否被遍历过,预处理出现问题.
CPP#include<bits/stdc++.h>
using namespace std;
#define xx 500010
int n,m,s,fa[xx],dp[xx];
bool vis[xx];
vector<int>g[xx];
void dfs(int x,int f,int d){
fa[x]=f;dp[x]=d;vis[x]=1;
for(int i=0;i<g[x].size();i++)if(!fa[g[x][i]])dfs(g[x][i],x,d+1);
return;
}
int solve(int x,int y){
int c=abs(dp[x]-dp[y]);
if(dp[x]<dp[y])while(c--)y=fa[y];
if(dp[y]<dp[x])while(c--)x=fa[x];
while(x!=y)x=fa[x],y=fa[y];
return x;
}
int main(){
cin>>n>>m>>s;
for(int i=1;i<n;i++){
int u,v;cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
dfs(s,0,1);
while(m--){
int x,y;cin>>x>>y;
cout<<solve(x,y)<<'\n';
}
// for(int i=1;i<=n;i++)cout<<dp[i]<<' ';
return 0;
}
将
CPP for(int i=0;i<g[x].size();i++)if(!fa[g[x][i]])dfs(g[x][i],x,d+1);
改为
CPP for(int i=0;i<g[x].size();i++)if(!vis[g[x][i]])dfs(g[x][i],x,d+1);
就预处理正确了
求大佬解释,蒟蒻CPU烧了(
回复
共 1 条回复,欢迎继续交流。
正在加载回复...