Encuentra el camino más largo desde la raíz hasta la hoja en un árbol

15

Tengo un árbol (en el sentido de la teoría de grafos), como el siguiente ejemplo:

ingrese la descripción de la imagen aquí

Este es un árbol dirigido con un nodo inicial (la raíz) y muchos nodos finales (las hojas). Cada uno de los bordes tiene una longitud asignada.

Mi pregunta es, ¿cómo encontrar el camino más largo que comienza en la raíz y termina en cualquiera de las hojas? El enfoque de fuerza bruta es verificar todos los caminos de la raíz y tomar el que tenga la longitud máxima, pero preferiría un algoritmo más eficiente si lo hubiera.

Graviton
fuente

Respuestas:

16

Ran G. dio pistas sobre un algoritmo eficiente, aunque tal vez omitió algunos detalles. Calcular todas las rutas raíz-hoja es, de hecho, un poco ineficiente si está haciendo un trabajo una y otra vez, por ejemplo, si calcula cada ruta y luego calcula la longitud.

Realice el siguiente algoritmo recursivo comenzando con LongestPath(root)le dará lo que desea. Esencialmente, calcula recursivamente la ruta más larga para cada subárbol. En cada nodo esto requiere construir los nuevos caminos y devolver el más largo.

 LongestPath(node)
   If node is a leaf, return (node,0) 
   If node is not a leaf:  
    For each edge (node,length,next):
       Let (p,l) = LongestPath(next)
       Let (path,len) = (p++[next], l + length)
    Return element (path,len) from previous step with largest value len

Esta es una combinación de pseudocódigo con alguna notación de Haskell, por lo que espero que sea comprensible.

Dave Clarke
fuente