社区讨论
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 条回复,欢迎继续交流。
正在加载回复...