Я реализовал алгоритм Беллмана-Форда для решения задачи (с графом), но это решение было слишком медленным, поэтому я заменил очередь Беллмана-Форда кучей (std::set), поэтому решение для кратчайшего путь будет найден быстрее. (как-то близко алгоритм Дейкстры)
Теперь я вставляю номер узла в кучу, поэтому std::set по умолчанию будет сортировать узлы, используя их количество, а не их стоимость. Все нормально, и алгоритм дает правильные ответы.
Если я реализую пользовательскую функцию сравнения для std::set , чтобы узлы сортировались по их расстоянию, а не по их количеству, алгоритм больше не обеспечивает кратчайшее расстояние до остальных узлов.
Это моя функция сравнения:
struct cmp{
bool operator() (const int &a,const int &b) const{
return (d[Q][a] < d[Q][b] );
}
};
set <int,cmp> q;
Таким образом, будучи алгоритмом BF, алгоритм работает до тех пор, пока не станет возможным улучшение. Может ли функция сравнения каким-то образом «испортить» std::set, потому что это единственная причина, по которой я понимаю, почему добавление этой функции сравнения даст неверные ответы...
Я имею в виду, почему это будет работать, если узлы находятся в совершенно случайном порядке, но не будет работать, если они упорядочены по их стоимости...