求助lca板子
  • 板块学术版
  • 楼主SerokSSR
  • 当前回复3
  • 已保存回复3
  • 发布时间2020/7/28 20:22
  • 上次更新2023/11/6 21:55:56
查看原帖
求助lca板子
125032
SerokSSR楼主2020/7/28 20:22

10pts

#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
const int N = 500050;
struct node {
	int u, v, next;
} e[N*2];
int h[N], tot = 1;
void add(int x, int y) {
	e[tot] = {x, y, h[x]};
	h[x] = tot++;
	e[tot] = {y, x, h[y]};
	h[y] = tot++;
}
int f[22][N];
int dep[N];
int n, m, s;
void dfs(int x) {
	
	for(int i=h[x]; i; i=e[i].next) {
		int v = e[i].v;
		if(v == f[0][x]) continue;
		f[0][v] = x; dep[v] = dep[x] + 1;
		dfs(v);
	}
}

int lca(int a, int b) {
	
	if(dep[a] > dep[b]) swap(a, b);
	
	int x = dep[b] - dep[a];
	for(int j=20; j>=0; --j) {
		if(x >= (1<<j)) {
			b = f[j][b]; x -= (1<<j);
		}
	}
	
	for(int j=20; j>=0; --j) {
		if(f[j][a] != f[j][b]) {
			a = f[j][a]; b = f[j][b];
		}
	}
	return f[0][b];
}
int main() {
	//freopen("P3379_1.in", "r", stdin);
	scanf("%d%d%d", &n, &m, &s);
	for(int i=1; i<n; ++i) {
		int x, y; scanf("%d%d", &x, &y);
		add(x, y);
	}
	f[0][s] = s; dep[s] = 1;
	dfs(s);
	
	for(int j=1; j<=20; ++j) {
		for(int i=1; i<=n; ++i) {
			f[j][i] = f[j-1][f[j-1][i]];
		}
	}
	
	for(int i=1; i<=m; ++i) {
		int a, b; scanf("%d%d", &a, &b);
		printf("%d\n", lca(a, b));
	}
	
	return 0;
}
2020/7/28 20:22
加载中...