Я реализовал алгоритм Беллмана-Форда для решения проблемы (с графиком), но это решение было слишком медленным, поэтому я заменил очередь Беллмана-Форда кучей (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, потому что это единственная причина, по которой я понимаю, почему добавление этой функции сравнения даст неправильные ответы ...
Я имею в виду, почему это будет работать, если узлы находятся в совершенно случайном порядке, но не будут работать, если они упорядочены по их стоимости ...