Самый длинный ациклический путь в направленном невзвешенном графике
Какой алгоритм можно использовать для поиска самого длинного пути в невзвешенном ориентированном ациклическом графе?
Ответы
Ответ 1
Динамическое программирование. Он также ссылается на Самая длинная проблема пути, учитывая, что это DAG.
Следующий код из Википедии:
algorithm dag-longest-path is
input:
Directed acyclic graph G
output:
Length of the longest path
length_to = array with |V(G)| elements of type int with default value 0
for each vertex v in topOrder(G) do
for each edge (v, w) in E(G) do
if length_to[w] <= length_to[v] + weight(G,(v,w)) then
length_to[w] = length_to[v] + weight(G, (v,w))
return max(length_to[v] for v in V(G))
Ответ 2
Пока график ацикличен, все, что вам нужно сделать, - это отрицать веса ребер и запускать любой алгоритм кратчайшего пути.
EDIT: Очевидно, вам нужен алгоритм кратчайшего пути, поддерживающий отрицательные веса. Кроме того, алгоритм из Википедии, похоже, имеет лучшую временную сложность, но я оставлю свой ответ здесь для справки.
Ответ 3
В Википедии есть алгоритм: http://en.wikipedia.org/wiki/Longest_path_problem
Похоже, что они используют весовые коэффициенты, но должны работать с весами, установленными на 1.
Ответ 4
Может быть решена методом критического пути:
1. Найти топологическое упорядочение
2. Найдите критический путь
см. [Horowitz 1995], Основы структур данных на С++, Computer Science Press, Нью-Йорк.
Жадная стратегия (например, Дейкстра) не будет работать, не важно: 1. используйте "max" вместо "min" 2. преобразуйте положительные веса в отрицательные 3. дайте очень большое число M и используйте M-w как вес.