20

У меня есть DAG (с затратами/весами на край) и хотите найти самый длинный путь между двумя наборами узлов. Два набора начальных и целевых узлов являются непересекающимися и малыми по сравнению с общим числом узлов на графике.Как найти самый длинный путь в графе с набором начальных и целевых точек?

Я знаю, как это сделать эффективно между один стартовый и целевой узел. С несколькими я могу перечислить все пути от каждого запуска до каждого целевого узла и выбрать самый длинный, но это займет квадратное число поисков одиночного пути. Есть ли способ лучше?

+0

http://www.geeksforgeeks.org/find-longest-path-directed-acyclic-graph/ – Techie

+1

Это может быть полезно. [Длинный путь в DAG] [1] [1]: http://stackoverflow.com/questions/10712495/longest-path-in-a-dag –

ответ

15

Я предполагаю, что вам нужен самый длинный путь, который запускается в любом из узлов из первого набора и заканчивается в любом из узлов второго набора. После этого вы можете добавить два виртуальные узлы:

  • Первый узел не имеют предшественников и его преемники являются узлами из первого набора.

  • Второй узел не имеет преемников, а его предшественниками являются узлы второго набора.

Все вновь добавленные края должны иметь нулевой вес.

График все еще будет DAG. Теперь, если вы используете стандартный алгоритм для поиска самого длинного пути в DAG между двумя новыми узлами, вы получите самый длинный путь, который начинается в первом наборе и заканчивается во втором наборе, за исключением того, что будет добавлен дополнительный нуль- взвешенный край в начале и дополнительный нулевой вес в конце.

Кстати, это решение, по сути, выполняет алгоритм из всех узлов из первого набора, но параллельно, в отличие от последовательного подхода, который предлагает ваш вопрос.

+0

Я надеюсь, что я не принял ответ слишком рано, потому что интуитивно это имеет большой смысл и удивительно легко! С другой стороны, я все еще хочу протестировать его против решения грубой силы. Но насколько я могу думать, это будет полностью работать! Благодаря! – starmole

+0

Если понятно, что мое решение работает, единственное, что может пойти не так, это производительность. Топологическая сортировка принимает линейное время в размере графика (узлы + ребра), поэтому два добавленных узла с несколькими ребрами практически не имеют разницы. Если узел лежит на пути от начала и конечного узла, мои алгоритмы обрабатывают его один раз, алгоритм грубой силы один раз для каждой пары начальных и конечных узлов, между которыми он находится. Также мое решение нуждается в инициализации и постпроцессинге только один раз, в то время как аллому с грубой силой необходимо получить фактический самый длинный путь кандидата для каждой пары, чтобы избежать чрезмерного потребления памяти. – Palec

Смежные вопросы