У меня есть дерево (в смысле теории графов), например, в следующем примере:
Это направленное дерево с одним начальным узлом (корень) и множеством конечных узлов (листья). Каждому ребру назначена длина.
Мой вопрос: как найти самый длинный путь, начинающийся у корня и заканчивающийся у любого из листьев? Подход грубой силы состоит в том, чтобы проверить все пути корневых листьев и выбрать путь с максимальной длиной, но я бы предпочел более эффективный алгоритм, если он есть.
algorithms
graphs
Гравитон
источник
источник
Ответы:
Ран Г. дал намеки на эффективный алгоритм, хотя, возможно, он не учел некоторые детали. Вычисление всех корневых путей действительно немного неэффективно, если вы выполняете работу снова и снова, например, если вы вычисляете каждый путь, а затем вычисляете длину.
Выполните следующий рекурсивный алгоритм, начиная с
LongestPath(root)
того, что даст то, что вы хотите. По сути, он вычисляет рекурсивно самый длинный путь для каждого поддерева. На каждом узле это требует построения новых путей и возврата самого длинного.Это комбинация псевдокода с некоторой нотацией на Haskell, поэтому я надеюсь, что она понятна.
источник