P3379求条 宣三观
  • 板块灌水区
  • 楼主cinCi
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/12/15 12:17
  • 上次更新2024/12/15 16:15:14
查看原帖
P3379求条 宣三观
1101269
cinCi楼主2024/12/15 12:17

全re

#include<bits/stdc++.h>
#define N 1000020
using namespace std;
int n,m,s;
vector<int> a[N];
int d[N],b[N],b1[N][20];
void dfs(int u){
	d[u]=d[b[u]]+1;
	for(int i=0;i<a[u].size();i++){
		int k=a[u][i];
		if(b[u]==k) continue;
		b[k]=u;
		dfs(k);
	}
}
void init(){
	for(int i=1;i<=n;i++){b1[i][0]=b[i];}
	for(int i=1;i<=18;i++){
		for(int j=1;j<=n;j++){
			b1[j][i]=b1[b1[j][i-1]][i-1];
		}
	}
}
int lca(int x,int y){
	if(d[x]<d[y]) swap(x,y);
	for(int i=18;i>=0;i--){
		if(d[y]<=d[b1[x][i]]){
			x=b1[x][i];
		}
	}
	if(x==y) return x;
	for(int i=18;i>=0;i--){
		if(b1[x][i]!=b1[y][i]){
			x=b1[x][i],y=b1[y][i];
		}
	}
	return (b1[x][0]==0 ? s : b1[x][0]);
}
int main(){
	scanf("%d %d %d",&n,&m,&s);
	for(int i=1;i<=n-1;i++){
		int u,v;
		scanf("%d %d",&u,&v);
		a[u].push_back(v);
		a[v].push_back(u);
	}
	d[s]=0,b[s]=-1;
	dfs(s);
	init();
	while(m--){
		int a,b;
		scanf("%d %d",&a,&b);
		printf("%d\n",lca(a,b));
	}
	return 0;
}
2024/12/15 12:17
加载中...