P3379 【模板】最近公共祖先(LCA)
查看原帖
P3379 【模板】最近公共祖先(LCA)
1015305
lzhAC楼主2024/6/10 09:35
#include <bits/stdc++.h>
using namespace std;
struct node{
	int p,id;
};
int n,m,root;
int fa[500010],vis[500010],ans[500010];
vector<int> e[500010];
vector<node> q[500010];	
int find(int x){	
	if(fa[x]==x) return x;
	return fa[x]=find(fa[x]);
}
void tarjan(int x){
	vis[x]=1;
	for(int i=0;i<e[x].size();i++){
		int nx=e[x][i];
		if(vis[nx]) continue;
		tarjan(nx);
		fa[nx]=x;
	}
	for(int i=0;i<q[x].size();i++){
		int px=q[x][i].p,ix=q[x][i].id;
		if(vis[px]==0) ans[ix]=find(px);
	}
	vis[x]=0;
}
int main(){
	cin>>n>>m>>root;
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1;i<=n-1;i++){
		int x,y;
		cin>>x>>y;
		e[x].push_back(y);
		e[y].push_back(x);
	}
	for(int i=1;i<=m;i++){
		int x,y;
		cin>>x>>y;
		q[x].push_back((node){y,i});
		q[y].push_back((node){x,i});
	}
	tarjan(root);
	for(int i=1;i<=m;i++) cout<<ans[i]<<endl;
	return 0;
}
                            总有一个点过不了 wa
2024/6/10 09:35
加载中...