Esta es una solicitud de referencia, ya que estoy seguro de que lo que sigue no es nuevo, pero no puedo encontrarlo.
Supongamos que tenemos un árbol finito con pesos no negativos en las aristas. De manera ingenua, calcular las longitudes de los caminos (es decir, la suma de los pesos a lo largo del camino único) entre cada par requiere pasos: hay pares de vértices y siempre podemos acotar el número de aristas en cualquier camino por .
Sin embargo, podemos hacerlo mucho mejor con el siguiente truco. Elija una raíz para de manera arbitraria. Defina el ancestro común más cercano de y como el vértice donde el camino desde hasta se encuentra con el camino desde hasta . Entonces, si denota la distancia en , obtenemos $d(i,j) = d(i,r) + d(j,r) - 2d(a,r).
Es fácil ver que todos los se pueden calcular en pasos con BFS. También hay una estructura de datos de Harel y Tarjan que, después de un preprocesamiento de , responderá consultas del ancestro común más cercano en tiempo . Entonces, todo el proceso se convierte en .