Обратите внимание, что Дейкстра работает даже для отрицательных весов, если у Графа нет отрицательных циклов, то есть циклов, у которых суммарный вес меньше нуля.
Конечно, можно спросить, почему в примере, сделанном с помощью templatetypedef, Дейкстра терпит неудачу, даже если нет отрицательных циклов, даже не циклов.Это потому, что он использует другой критерий остановки, который содержит алгоритм, как только целевой узел достигнут (или все узлы были рассчитаны один раз, он не указал это точно).На графике без отрицательных весов это работает нормально.
Если используется альтернативный критерий остановки, который останавливает алгоритм, когда очередь приоритета (куча) становится пустой (этот критерий остановки также использовался в вопросе), тогда дейкстра найдет правильное расстояние даже для графов с отрицательными весами, но без отрицательных циклов.
Однако в этом случае асимптотическая временная граница Дейкстры для графов без отрицательных циклов теряется.Это связано с тем, что ранее установленный узел может быть повторно вставлен в кучу, когда найдено лучшее расстояние из-за отрицательных весов.Это свойство называется исправлением метки.