const int MAXN = 1e6 + 100;
struct LCA {
struct edge {
int from, to, w, nxt;
}edges[MAXN << 3];
int head[MAXN], cnt, n;
int id[MAXN], dep[MAXN], dist[MAXN];
int fa[MAXN][32];
void addedge(int u, int v, int w) {
edges[cnt] = { u,v,w,head[u] };
head[u] = cnt++;
}
void init(int _n) {
n = _n;
for (int i = 0; i <= n; i++) {
head[i] = -1;
dep[i] = dist[i] = 0;
}
cnt = 0;
}
void init_LCA() {
for (int i = 1; i <= n; i++) {
if (!dep[i]) dfs(i);
}
for (int j = 1; j < 32; j++) {
for (int i = 1; i <= n; i++) {
fa[i][j] = fa[fa[i][j - 1]][j - 1];
}
}
}
void dfs(int u, int f = -1) {
for (int i = head[u]; i != -1; i = edges[i].nxt) {
int v = edges[i].to;
if (v == f)continue; //
dep[v] = dep[u] + 1;
dist[v] = dist[u] + edges[i].w;
fa[v][0] = u;
dfs(v, u);
}
}
int getlca(int x, int y) {
if (dep[x] < dep[y]) swap(x, y);
int i;
for (i = 0; (1 << i) <= dep[x]; i++);
i--;
for (int j = i; j >= 0; j--) {
if (dep[x] - (1 << j) >= dep[y])
x = fa[x][j];
}
if (x == y) return x;
for (int j = i; j >= 0; j--) {
if (fa[x][j] != fa[y][j]) {
x = fa[x][j];
y = fa[y][j];
}
}
return fa[x][0];
}
int getdist(int x, int y) {
return dist[x] + dist[y] - 2 * dist[getlca(x, y)];
}
int getdep(int x) {
return dep[x] + 1;
}
}L;
LCA 倍增算法
最新推荐文章于 2023-09-13 15:24:56 发布