成员:
const int maxn =
1007;
int up[maxn][
32];
int depth[maxn];
int n,m;
bool vis[maxn];
vector<int> tree[maxn];
函数:
DFS记录深度和初始化倍增数组:
void dfs(
int u,
int d) {
depth[u] = d;
vis[u] =
true;
for(
auto i : tree[u])
if(!vis[i]) {
dfs(i, d+
1);
up[i][
0] = u;
}
}
处理倍增数组:
void process() {
for(
int j=
1 ; j<
31 ; j++)
for(
int i=
1 ; i<=n ; i++)
if(up[i][j-
1]!=-
1)
up[i][j] = up[up[i][j-
1]][j-
1];
}
LCA函数实现:
int lca(
int u,
int v) {
if(depth[u] < depth[v]) swap(u,v);
int tmp = depth[u] - depth[v];
for(
int j =
0 ; j <=
30 && depth[u] != depth[v] ; j++) {
if(tmp&(
1<<j))
u = up[u][j];
}
if(u == v)
return v;
for(
int j =
30 ; j>=
0 ; j--) {
if(up[u][j] != up[v][j])
u = up[u][j], v = up[v][j];
}
return up[u][
0];
}
汇总:
const int maxn =
1007;
int up[maxn][
32];
int depth[maxn];
int n,m;
bool vis[maxn];
vector<int> tree[maxn];
void dfs(
int u,
int d) {
depth[u] = d;
vis[u] =
true;
for(
auto i : tree[u])
if(!vis[i]) {
dfs(i, d+
1);
up[i][
0] = u;
}
}
void process() {
for(
int j=
1 ; j<
31 ; j++)
for(
int i=
1 ; i<=n ; i++)
if(up[i][j-
1]!=-
1)
up[i][j] = up[up[i][j-
1]][j-
1];
}
int lca(
int u,
int v) {
if(depth[u] < depth[v]) swap(u,v);
int tmp = depth[u] - depth[v];
for(
int j =
0 ; j <=
30 && depth[u] != depth[v] ; j++) {
if(tmp&(
1<<j))
u = up[u][j];
}
if(u == v)
return v;
for(
int j =
30 ; j>=
0 ; j--) {
if(up[u][j] != up[v][j])
u = up[u][j], v = up[v][j];
}
return up[u][
0];
}