求助有几个数据很大的点t了
查看原帖
求助有几个数据很大的点t了
143742
Nelson_Wang楼主2021/7/30 18:58

求助有几个数据很大的点t了

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 500005;

int n, m, s, cnt;
int dep[MAXN], fa[MAXN][32], nex[MAXN], hed[MAXN], e[MAXN*2];

void add(int a, int b){
	e[++cnt] = b, nex[cnt] = hed[a], hed[a] = cnt;
	e[++cnt] = a, nex[cnt] = hed[b], hed[b] = cnt;
}
void dfs(int k, int f){
	dep[k] = dep[f]+1;
	fa[k][0] = f;
	for(int i=1; (1<<i)<=dep[k]; ++i)
		fa[k][i] = fa[fa[k][i-1]][i-1];
	for(int i=hed[k]; i; i=nex[i])
		if(e[i]!=f)
			dfs(e[i], k);
}
int lca(int x, int y){
	if(dep[x]>dep[y])
		swap(x, y);
	for(int i=20; ~i; --i)
		if(dep[y]-(1<<i)>=dep[x])
			y = fa[y][i];
	if(x==y)
		return x;
	for(int i=20; ~i; --i)
		if(fa[x][i]!=fa[y][i])
			x = fa[x][i], y = fa[y][i];
	return fa[x][0];
}
int main(){
	freopen("input.txt", "r", stdin);
	scanf("%d%d%d", &n, &m, &s);
	int a, b;
	for(int i=1; i<n; ++i){
		scanf("%d%d", &a, &b);
		add(a, b);
	}
	dfs(s, 0);
	while(m--){
		scanf("%d%d", &a, &b);
		printf("%d\n", lca(a, b));
	}
	return 0;
}
2021/7/30 18:58
加载中...