求助:倍增求LCA错的五彩缤纷
查看原帖
求助:倍增求LCA错的五彩缤纷
188104
StObOtZ楼主2021/7/8 14:49
#include<bits/stdc++.h>
using namespace std;
int n,m,i,x,y,k,root;
int f[500005][22],lg[22],h[500005],dep[500005],r[1000005],t[1000005],a[500005];
inline int read(){
	int x=0,m=1;
	char ch=getchar();
	while(!isdigit(ch)){
		if(ch=='-') m=-1;
		ch=getchar();
	}
	while(isdigit(ch)){
		x=x*10+ch-48;
		ch=getchar();
	}
	return x*m;
}
inline void write(int x){
	if(x < 0){
		putchar('-');
		write(-x);
		return;
	}
	if(x>=10) write(x/10);
	putchar(x%10+'0');
}
int LCA(int x,int y){
	int r_1=x,r_2=y;
	if (dep[r_1]>dep[r_2])
		for (int i=21;i>=0;i--)
			if (lg[i]<=dep[r_1]-dep[r_2])	r_1=f[r_1][i];
	else if (dep[r_1]<dep[r_2])
		for (int i=21;i>=0;i--)
			if (lg[i]<=dep[r_2]-dep[r_1])	r_2=f[r_2][i];
	if (r_1==r_2) return r_1;
	for (int i=21;i>=0;i--)
		if (f[r_1][i]!=f[r_2][i]){
			r_1=f[r_1][i];
			r_2=f[r_2][i];
		}
	return f[r_1][0];
}
void build(int ro,int fa){
	f[ro][0]=fa;
	dep[ro]=dep[fa]+1;
	for (int i=1;i<=21;i++)	f[ro][i]=f[f[ro][i-1]][i-1];
	x=h[ro];
	while (x!=0){
		if (t[x]==f[x][0]){
			x=r[x];
			continue;
		}
		build(t[x],ro);
		x=r[x];
	}
}
signed main()
{
	n=read(),m=read(),root=read();
	for (int i=1;i<n;i++){
		x=read(),y=read();
		k++;
		r[k]=h[x];
		h[x]=k;
		t[k]=y;
		k++;
		r[y]=h[y];
		h[y]=k;
		t[k]=x;
	}
	build(root,root);
	lg[0]=1;
	for (int i=1;i<=21;i++)	lg[i]=lg[i-1]*2;
	for (int i=1;i<=m;i++){
		x=read(),y=read();
		write(LCA(x,y));
		putchar('\n');
	}
}

记录

2021/7/8 14:49
加载中...