Алгоритм Дейкстры с отрицательными ребрами на ориентированном графе

Что делать, если единственные отрицательные затраты на фронт исходят из первоначального node? Будет ли алгоритм работать?

Мне кажется, что да, потому что я не могу придумать контр-пример, но у меня проблемы с этим. Есть ли встречный пример?

Отрицательные ребра являются проблемой для Dijkstra, потому что нет гарантии, что выбранный вами край производит кратчайший путь, если есть край, который вы можете выбрать позже, который в значительной степени отрицательно взвешен. Но если только отрицательные ребра выходят из начального node, я не вижу проблемы.

Я не ищу алгоритм. Я ищу некоторое представление о Дикстре.

Я говорю о ориентированном графике, если это имеет значение.

Ответы

Ответ 1

Counter-пример:

График G = (V, E) с вершинами V = {A, B}, ребрами E = {(A, B), (B, A)} и весовой функцией w (A, B) = -2, w (B, A) = +1.

Существует отрицательный весовой цикл, поэтому минимальные расстояния undefined (даже с использованием A в качестве начального node).

Ответ 2

Проблема с наличием негативного ценового края заключается в том, что вы можете перемещаться туда и обратно вдоль него столько раз, сколько хотите.

Если вы наложили правило, что ребро не может использоваться более одного раза, у вас все еще есть проблема. Алгоритм Дейкстры включает в себя маркировку node как "посещенный", когда расстояние от начального node считается разузнанным раз и навсегда. Это происходит до того, как все края будут проверены; был найден самый короткий путь от начального node до node X, все остальные пути от начального node уже длиннее этого, ничто, которое впоследствии не обнаружено, может сделать эти пути короче. Но если где-то есть грани с отрицательной стоимостью, то более позднее обнаружение может сделать путь короче, поэтому может быть, что существует более короткий путь, который Dijkstra не обнаружит.

Если только ребра, которые подключаются к исходному node, могут иметь отрицательные затраты, тогда у вас все еще есть проблемы, потому что кратчайший путь может включать пересмотр начального node, чтобы воспользоваться отрицательными затратами, то, что Дейкстра не может сделать.

Если вы наложите другое правило, что node не может быть посещено более одного раза, тогда работает алгоритм Дейкстры. Заметим, что в алгоритме Дейкстры начальному node задано начальное расстояние от нуля. Если вы дадите ему другое начальное расстояние, алгоритм по-прежнему найдет кратчайший путь, но все расстояния будут отключены на эту же сумму. (Если вам нужно реальное расстояние в конце, вы должны вычесть значение, которое вы ввели.)

  • Итак, возьмите свой график, назовите его A, найдите наименьшую стоимость любого ребра, связанного с исходным node, назовите его k, который в этом случае будет отрицательным).
  • Создайте новый график B, который вы получите путем вычитания k из стоимости каждого ребра, связанного с начальным node. Обратите внимание, что все эти затраты теперь неотрицательны. Поэтому Дейкстра работает на B. Также обратите внимание, что самый короткий путь в B также является самым коротким путем в A.
  • Назначьте начальное node of B расстояние k, а затем запустите Dijkstra (это даст тот же путь, что и запуск с начальным расстоянием нуля). Сравните это с тем, что Dijkstra наивно на A: как только вы оставите исходный node все то же самое на двух графиках. Расстояние одинаковое, решения одинаковы, два будут производить один и тот же путь. А в случае A distace будет правильным, так как он начинался с нуля.

Ответ 3

Алгоритм Дейкстры не дает правильного ответа для графика с отрицательными весами ребер (даже если граф не имеет никакого отрицательного кругового цикла). Напр. он вычисляет неверное кратчайшее значение пути между (A, C) для следующего графика с исходной вершиной A,

A -> B : 6
A -> C : 5
B -> D : 2
B -> E : 1
D -> E : -5
E -> C : -2