Я посмотрел на реализацию алгоритма dijkstra found here, но, похоже, он отлично работает для отрицательных весов.Может ли кто-нибудь меня понять, почему эта реализация алгоритма dijkstra не работает для отрицательных весов?
В частности, метод relax обновляет расстояние вершины в очереди приоритетов или вставляет его обратно, если он не был первоначально в очереди.
И поскольку нет никаких проверок, чтобы убедиться, что мы не вставляем уже известную вершину, не будет ли эта реализация более похожей на алгоритм bellman-ford, где мы продолжаем вставлять вершины, чтобы посещать и расслабляться, пока не закончится краев, которые уменьшают расстояние?
Например:
При запуске его на изображении ниже с А в качестве источника, мы сначала определить следующие расстояния:
C = 0
B = 1
D = 99
Затем после наших удалений очереди, мы остались с (D , 99), что заставляет нас посетить вершину D и расслабить ее. При ослаблении вершины D получаем, что (от D до B = -300), что делает расстояние до B равным -201. Теперь, используя вышеописанный метод «расслабиться», мы снова вставляем (B, -201) в очередь. Теперь мы берем min очереди, которая является (B, -201), которую мы только что вставили. Из этого мы расслабляем B, и мы можем получить расстояние до C до -200.
Я знаю, что любой отрицательный цикл сделает программа не завершается, но что, если задан график, без отрицательного цикла? Надеюсь, у меня здесь нет ничего тривиального. Спасибо за любую помощь!
Попробуйте отрицательный вес в любом цикле. – greybeard
Этот вопрос имеет довольно историю только на SO, но посмотрите на его [CS-ответ] (http://cs.stackexchange.com/questions/19771/why-does-dijkstras-algorithm-fail-on-a- отрицательные взвешенные графы). – greybeard