社区讨论

why RE*2(玄关)

学术版参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mi5oz8ew
此快照首次捕获于
2025/11/19 15:39
3 个月前
此快照最后确认于
2025/11/21 00:02
3 个月前
查看原帖
rt, 帮忙看看。
题目id:link
代码:
CPP
#include <bits/stdc++.h>

#define I ios::sync_with_stdio(false);cin.tie(0)

using ll = long long;

using namespace std;

int n, rt;

map <int, int> fa;

struct E {
	int to, nxt;
}edge[500005];

int f[500005][25];

int dep[500005], etot, head[500005];

void dfs(int u, int fa) {
	f[u][0] = fa;
	for(int i = 1;i <= 19; i++) {
		f[u][i] = f[f[u][i - 1]][i - 1];
	}
	
	for(int i = head[u]; i != 0; i = edge[i].nxt) {
		int v = edge[i].to;
		
		if(v == fa) continue;
		
		dep[v] = dep[u] + 1;
		
		dfs(v, u);
	}
	
}

void add (int u, int v) {
	edge[++etot] = {v, head[u]};
	head[u] = etot;
}

int read () {
	int x = 0, f = 1;
	char ch = getchar();
	while(!isdigit(ch)) {
		if(ch == '-') f = -f;
		ch = getchar();
	}
	while(isdigit(ch)) {
		x = x * 10 + ch - '0';
		ch = getchar();
	}
	return x * f;
}

void print (int x) {
	if(x < 0) {
		putchar('-');
		x = -x;
	}
	stack <int> s;
	while(x) {
		s.push(x % 10);
		x /= 10;
	}
	while(!s.empty() ) {
		putchar(s.top() + '0');
		s.pop();
	}
	cout << '\n';
}

int lca(int u, int v) {
	if(dep[u] < dep[v]) swap(u, v);
	
	for(int i = 19; i >= 0; i--) {
		if(f[u][i] && dep[f[u][i]] >= dep[v]) u = f[u][i];
	}
	
	if(u == v) return u;
	
	for(int i = 19; i >= 0; i--) {
		if(f[u][i] != f[v][i]) u = f[u][i], v = f[v][i];
	}
	
	return f[u][0];
}


int main (void) {
	
	n = read();
	int m = read();
	int rt = read();
	
	for(int i = 1; i < n; i++) {
		int u, v;
		u = read();
		v = read();
		
		add(u, v), add(v, u);
		
	}
	
	dep[rt] = 0;
	
	dfs(rt, 0);
	
	
	while(m--)  {
		int x, y;
		cin >> x >> y;
		cout << lca(x, y) << '\n';
	}
	
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...