社区讨论

求大佬讲解

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 条回复,欢迎继续交流。

正在加载回复...