2015-team4/lca
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
{{{
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10;
int fa[MAXN][21],dep[MAXN];
vector<int> e[MAXN];
void dfs(int v, int f)
{
fa[v][0] = f;
for(int i = 1; i <= 20; i++) fa[v][i] = fa[fa[v][i-1]][i-1];
for(int i = 0; i < e[v].size(); i++){
int u = e[v][i];
if(u == f) continue;
dep[u] = dep[v] + 1;
dfs(u, v);
}
}
int lca(int x, int y){
if(dep[x] < dep[y]) swap(x, y);
int d = dep[x] - dep[y];
for(int i = 0; i <= 20; i++)
if(d>>i&1) x = fa[x][i];
if(x == y) return x;
for(int i = 20; i >= 0; i--)
if(fa[x][i] != fa[y][i]) x = fa[x][i], y = fa[y][i];
return fa[x][0];
}
int main(){
int n;
scanf("%d", &n);
for(int i = 1; i < n; i++){
int x, y;
scanf("%d%d", &x, &y);
e[x].push_back(y);
e[y].push_back(x);
}
dfs(1, 0);
int m;
scanf("%d", &m);
for(int i = 1; i <= m; i++){
int x, y;
scanf("%d%d", &x, &y);
printf("%d\n", lca(x, y));
}
return 0;
}
}}}
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10;
int fa[MAXN][21],dep[MAXN];
vector<int> e[MAXN];
void dfs(int v, int f)
{
fa[v][0] = f;
for(int i = 1; i <= 20; i++) fa[v][i] = fa[fa[v][i-1]][i-1];
for(int i = 0; i < e[v].size(); i++){
int u = e[v][i];
if(u == f) continue;
dep[u] = dep[v] + 1;
dfs(u, v);
}
}
int lca(int x, int y){
if(dep[x] < dep[y]) swap(x, y);
int d = dep[x] - dep[y];
for(int i = 0; i <= 20; i++)
if(d>>i&1) x = fa[x][i];
if(x == y) return x;
for(int i = 20; i >= 0; i--)
if(fa[x][i] != fa[y][i]) x = fa[x][i], y = fa[y][i];
return fa[x][0];
}
int main(){
int n;
scanf("%d", &n);
for(int i = 1; i < n; i++){
int x, y;
scanf("%d%d", &x, &y);
e[x].push_back(y);
e[y].push_back(x);
}
dfs(1, 0);
int m;
scanf("%d", &m);
for(int i = 1; i <= m; i++){
int x, y;
scanf("%d%d", &x, &y);
printf("%d\n", lca(x, y));
}
return 0;
}