Lowest Common Ancestor (LCA) es el ancestro común más profundo de dos nodos en un árbol (o DAG). Es una query fundamental en árboles con aplicaciones en distances, queries de árbol, y problemas de grafos.
Binary Lifting
Preprocesa up[u][k] = el ancestro de u a distancia 2^k.
up[u][0] = parent[u]
up[u][k] = up[ up[u][k-1] ][k-1]
Complejidad: O(n log n) preprocessing, O(log n) query.
Query Binary Lifting
lca(u, v):
- Asegura
depth[u] <= depth[v]. - Sube
vhasta misma profundidad queuusando binary lifting. - Si
u == v: retornau. - Desde
k = log ndown to 0: siup[u][k] != up[v][k], sube ambos. - Retorna
parent[u](oup[u][0]).
Ejemplo
Árbol:
1
/ \\
2 3
/ \\
4 5
lca(4, 5):
- depth[4]=2, depth[5]=2 (iguales).
- k=1:
up[4][1]=1,up[5][1]=1→ iguales, no suben. - k=0:
up[4][0]=2,up[5][0]=2→ iguales, no suben. - Retorna
parent[4]=2.
Resultado: 2.
Euler Tour + RMQ
- Haz DFS y guarda el orden de visita (Euler tour).
- Para cada nodo, guarda su depth en un array paralelo.
- LCA(u,v) = nodo con mínimo depth en el rango entre primera aparición de
uy primera aparición dev. - Usa Sparse Table para RMQ en O(1).
Comparación
| Método | Preprocess | Query | Espacio |
|---|---|---|---|
| Binary Lifting | O(n log n) | O(log n) | O(n log n) |
| Euler + RMQ | O(n) | O(1) | O(n log n) |
Aplicaciones
- Tree queries — distancia entre nodos, k-th ancestor
- LCA en grafos — lowest common ancestors en DAGs
- Bioinformática — árboles filogenéticos
- Enseñanza — introduce binary lifting y RMQ
Trayectoria de Práctica
- Implementa binary lifting; traza lca(4,5) en el ejemplo.
- Implementa Euler tour + Sparse Table.
- Compara tiempos de query entre métodos.
- Investiga Tarjan’s offline LCA: ¿cómo responde todas las queries en O(n+Q)?
- Investiga LCA en árboles dinámicos (Link-Cut Tree).