Знайдіть найдовший шлях від кореня до листя на дереві


15

У мене є дерево (в сенсі теорії графів), наприклад наступний приклад:

введіть тут опис зображення

Це спрямоване дерево з одним початковим вузлом (корінь) і багатьма закінчуючими вузлами (листя). Кожен з ребер має призначену йому довжину.

Моє запитання: як знайти найдовший шлях, починаючи від кореня і закінчуючи на будь-якому з листя? Підхід грубої сили полягає у тому, щоб перевірити всі шляхи кореневих листів та взяти той із максимальною довжиною, але я б віддав перевагу більш ефективний алгоритм, якщо такий існує.


Відповіді:


16

Ран Г. дав підказки щодо ефективного алгоритму, хоча, можливо, він залишив деякі деталі. Обчислення всіх шляхів кореневих листів насправді трохи неефективне, якщо ви працюєте знову і знову, наприклад, якщо ви обчислюєте кожен шлях, а потім обчислюєте довжину.

Виконайте наступний рекурсивний алгоритм, починаючи з LongestPath(root)того, що ви отримаєте. По суті, він обчислює рекурсивно найдовший шлях для кожного піддерева. Для кожного вузла це вимагає побудови нових шляхів та повернення найдовшого.

 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

Це поєднання, якщо псевдо-код з деякими позначеннями Haskell, тож сподіваюся, це зрозуміло.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.