Encontre o caminho mais longo da raiz para a folha em uma árvore

15

Eu tenho uma árvore (no sentido da teoria dos grafos), como no exemplo a seguir:

insira a descrição da imagem aqui

Esta é uma árvore direcionada com um nó inicial (a raiz) e muitos nós finais (as folhas). Cada borda tem um comprimento atribuído a ela.

Minha pergunta é: como encontrar o caminho mais longo começando na raiz e terminando em qualquer uma das folhas? A abordagem da força bruta é verificar todos os caminhos da folha da raiz e seguir o caminho com comprimento máximo, mas eu preferiria um algoritmo mais eficiente, se houver um.

Graviton
fonte

Respostas:

16

Ran G. deu dicas para um algoritmo eficiente, embora talvez tenha deixado de fora alguns detalhes. A computação de todos os caminhos da folha raiz é de fato um pouco ineficiente se você estiver trabalhando repetidamente, por exemplo, se você calcular cada caminho e depois calcular o comprimento.

Execute o seguinte algoritmo recursivo, começando com LongestPath(root)o que você deseja. Essencialmente, ele calcula recursivamente o caminho mais longo para cada subárvore. Em cada nó, isso requer a construção dos novos caminhos e o retorno do mais longo.

 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 é uma combinação se pseudo-código com alguma notação Haskell, então espero que seja compreensível.

Dave Clarke
fonte