Eu tenho uma árvore (no sentido da teoria dos grafos), como no exemplo a seguir:
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.
algorithms
graphs
Graviton
fonte
fonte
Respostas:
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.Esta é uma combinação se pseudo-código com alguma notação Haskell, então espero que seja compreensível.
fonte