Я пытаюсь выяснить, можно ли использовать алгоритм Дейкстры, чтобы найти самый длинный путь в направленном ациклическом пути. Я знаю, что невозможно найти самый длинный путь с Дейкстре в общем графике из-за отрицательных циклов затрат. Но я думаю, что это должно работать в DAG. Через Google я нашел много противоречивых источников. Некоторые говорят, что это работает в даге, а некоторые говорят, что это не работает, но я не нашел доказательства или встречного примера. Может ли кто-нибудь указать мне на доказательство или встречный пример?
Дейкстра для самого длинного пути в DAG
Ответ 1
Я подумал о проблеме, и я думаю, что это невозможно вообще. Думаю, быть ацикличным недостаточно.
Например:
Мы хотим перейти от a к c в этом dag.
a - > b - > c
| /\
v |
d - - - - -
d-c имеет длину 4
a-d имеет длину 1
все остальные имеют длину 2
Если вы просто замените функцию min максимальной функцией, алгоритм приведет к a-b-c, но самый длинный путь - a-d-c.
Я нашел два особых случая, когда вы можете использовать Dijkstra для вычисления самого длинного пути:
- Граф не только ориентирован на ацикличность, но и ацикличен, если вы удаляете направления. Другими словами: Это дерево. Потому что в дереве самый длинный путь также является самым коротким путем.
- Граф имеет только отрицательные веса. Затем вы можете использовать max вместо min, чтобы найти самый длинный путь. НО это работает только в том случае, если веса действительно отрицательные. Если вы просто инвертируете положительные веса, это не сработает.
Ответ 2
Есть три возможных способа применения Dijkstra, NONE из них будут работать:
1. Прямо используйте операции "max" вместо операций "мин".
2. Преобразуйте все положительные веса в отрицательные. Затем найдите кратчайший путь.
3. Нарисуйте очень большое положительное число M. Если вес ребра w, теперь M-w используется для замены w. Затем найдите кратчайший путь.
Для DAG метод критического пути будет работать:
1: Найдите топологическое упорядочение.
2: Найдите критический путь.
см. [Horowitz 1995] E. Howowitz, S. Sahni и D. Metha, Основы структур данных на С++, Computer Science Press, Нью-Йорк, 1995 г.
Ответ 3
Проблема с длинным расстоянием не имеет оптимальной субструктуры для любого графика, DAG или нет. Однако любая задача о длинном расстоянии на графе G эквивалентна задаче кратчайшего расстояния в преобразованном графе G '= - G, т.е. знак каждого веса ребра обращается.
Если преобразованный граф G 'должен иметь отрицательные ребра и циклы, то алгоритм Беллмана-Форда используется для нахождения кратчайшего расстояния. Однако, если G гарантированно имеет только неотрицательные веса (т.е. G '- неположительные веса), то алгоритм Дейкстра может быть лучшим выбором по Bellman-Ford. (см. ответ "Евгений Клюев" для графика - Dijkstra для самого длинного пути с одним источником). Если G является DAG, то G 'также будет DAG. Для DAG у нас есть лучший алгоритм для поиска кратчайшего расстояния, и это должно быть выбрано по Дийкстре или Беллман-Форду.
Резюме:
Самая длинная проблема пути не имеет оптимальной субструктуры и, таким образом, модифицирует функцию min-weight в алгоритме Дейкстры для максимальной функции веса, не будет работать для графика, будь то DAG или нет. Вместо того, чтобы модифицировать любой алгоритм кратчайшего пути (ну тривиально), мы скорее преобразуем G и посмотрим, какой алгоритм кратчайшего пути лучше всего работает на преобразованном G.
Примечание
A-------B
| | assume: edges A-B, B-C, C-A of same weight
| |
+-------C
Мы видим MAX_DIS (A, B) = A- > C- > B
Для "MAX_DIS", чтобы быть оптимальной структурой, в приведенном выше случае отношение <
MAX_DIS(A,B) = MAX_DIS(A,C) + MAX_DIS(C,B) should be satisfied.
Но это не так, как мы видим, MAX_DIS (A, C) = A- > B- > C и MAX_DIS (C, B) = C- > A- > B и, таким образом, это пример того, что самая длинная проблема расстояния может не иметь оптимальной подструктуры.
Ответ 4
Единственное требование - не иметь отрицательных циклов. Если у вас нет циклов, вы можете переназначить отрицательные, добавив самое высокое абсолютное значение от отрицательных весов ко всем весам. Таким образом, вы потеряете отрицательные волны, так как весь вес будет равен или больше, чем ноль. Поэтому тоже подводите итог, чтобы беспокоиться не об отрицательном цикле.
Ответ 5
Я предлагаю вам изменить алгоритм Дейкстры, чтобы взять инвертированное значение веса кромки. Поскольку график ацикличен, алгоритм не будет вводить бесконечный цикл, используя отрицательные веса для оптимизации. Более того, теперь положительные веса становятся отрицательными, но, опять же, циклов нет. Это будет работать, даже если граф неориентирован, при условии, что вы запретите повторное вхождение посещенных узлов (т.е. Прекратите бесконечное переключение между двумя узлами, поскольку добавление отрицательного значения всегда будет лучше).