Какого алгоритма может быть использовано, чтобы найти самый длинный путь в невзвешенном ориентированном ациклическом графе?Серия ациклического путь в ориентированном графе невзвешенного
ответ
Dynamic programming. Он также упоминается в Longest path problem, учитывая, что он является 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))
Пока граф ациклический, все, что вам нужно сделать, это свести на нет края весов и запустить любой алгоритм кратчайшего пути.
EDIT: Очевидно, вам нужен алгоритм кратчайшего пути, поддерживающий отрицательные веса. Кроме того, алгоритм из Википедии, похоже, имеет лучшую временную сложность, но я оставлю свой ответ здесь для справки.
и сохраним отрицательные веса как отрицательные? : p – Hellnar
@Hellnar: нет, если у вас отрицательные веса в исходном графе, они должны стать положительными. w '= - (w) –
В Википедии есть алгоритм: http://en.wikipedia.org/wiki/Longest_path_problem
Похоже, они используют взвешивания, но должен работать с весовыми всем набором к 1.
может быть решен с помощью метода критического пути:
1. найти топологический порядок
2. найти критический путь
см [Horowitz 1995], Основы структуры данных в C++, Computer Science Press, Нью-Йорк.
Жадные стратегии (например Дейкстра.) Не будет работать, независимо от того: 1. используйте «max» вместо «min» 2. преобразуйте положительные веса в отрицательные 3. дайте очень большое число M и используйте M-w как вес.
- 1. Максимальный путь вес в ориентированном графе
- 2. Попытка получить кратчайший путь (bfs) в ориентированном графе в Erlang
- 3. Избегание циклов в ориентированном графе
- 4. Моделирование сети в ориентированном графе
- 5. Эффективный поиск в ориентированном графе
- 6. Сколько компонентов в ориентированном графе?
- 7. Найти кратчайший путь между двумя узлами в ориентированном взвешенном графе
- 8. Лучший способ найти, существует ли путь в однонаправленном ориентированном графе
- 9. Как я могу перечислить каждый путь в ориентированном графе? (C#)
- 10. Найти общий путь среди всех возможных путей в ориентированном графе
- 11. Как посетить каждую точку в ориентированном графе
- 12. Подсчитайте количество Эйлеровских PATH в ориентированном графе?
- 13. Быстрый поиск по бегу в ориентированном графе
- 14. Цикл в ориентированном графе в прологе
- 15. Выполнение DFS и BFS на ориентированном графе
- 16. Как скопировать счет в ориентированном графе в Python
- 17. Поиск всех циклов в ориентированном графе
- 18. Как найти вероятность пути в ориентированном графе?
- 19. Получить список параллельных путей в ориентированном графе
- 20. Копировать конструктор полиморфирован объектов в ориентированном графе
- 21. Циклы снятия в взвешенном ориентированном графе
- 22. SQL: получить неориентированных ссылки в ориентированном графе
- 23. Список всех отрицательных циклов в ориентированном графе
- 24. Перечисление всех путей в ориентированном ациклическом графе
- 25. как тестировать для двудольных в ориентированном графе
- 26. найти список всех узлов в ориентированном графе
- 27. Как распространять изменения в ориентированном графе?
- 28. Создания числа кратчайших в ориентированном графе
- 29. Поиск корня дерева в ориентированном графе
- 30. Алгоритм поиска кратчайших циклов в ориентированном графе
Это возвращает только длину пути. Можно ли легко изменить код, чтобы вернуть путь? – oschrenk
Да, так же, как и большинство проблем с DP - отслеживайте предыдущее и возвращайтесь к нему. – Larry
'topOrder (G),' список вершин G в [топологический порядке] (https://en.wikipedia.org/wiki/Topological_sorting) –