树剖求助
查看原帖
树剖求助
232507
OK咯莫名其妙楼主2021/7/17 15:13
#include<bits/stdc++.h>
using namespace std;
struct edge{
    int to,nt;
}e[1000005];
int n,m,s,ecnt,bh,hd[500005],de[500005],sz[500005],sq[500005],dn[500005],tp[500005],fa[500005],vr[500005],bg[500005];
void add(int x,int y)
{
    e[++ecnt].to=y;
    e[ecnt].nt=hd[x];
    hd[x]=ecnt;
}
void dfs1(int nw,int en){
	sz[nw]=1;
	fa[nw]=en;
	de[nw]=de[en]+1;
	for(int i=hd[nw];i;i=e[i].nt){
		if(vr[i]==en)continue;
		dfs1(vr[i],nw);
		sz[nw]+=sz[vr[i]];
		if(bg[nw]==0||sz[bg[nw]]<sz[vr[i]])bg[nw]=vr[i];
		
	}
}
void dfs2(int nw,int t){
	tp[nw]=t;
	dn[nw]=++bh;
	sq[bh]=nw;
	if(bg[nw])dfs2(bg[nw],t);
	for(int i=hd[nw];i;i=e[i].nt){
		if(vr[i]==fa[nw]||vr[i]==bg[nw])continue;
		dfs2(vr[i],vr[i]);
	}
}
int lca(int a,int b){
	while(tp[a]!=tp[b]){
		if(de[tp[a]]<de[tp[b]])
			swap(a,b);
		a=fa[tp[a]];
	}
	if(de[a]>de[b])swap(a,b);
	return a;
}
int main(){
	cin>>n>>m>>s;
	for(int i=1;i<=n-1;i++){
		int a,b;
		cin>>a>>b;
		add(a,b);
		add(b,a);
	}
	dfs1(s,s);
	dfs2(s,s);
	while(m--){
		int a,b;
		cin>>a>>b;
		cout<<lca(a,b)<<endl;
	}
	return 0;
}
2021/7/17 15:13
加载中...