我已经实现了一个 Bellman-Ford 算法来解决一个问题(带图),但是这个解决方案太慢了,所以我用堆 (std::set) 替换了 Bellman-Ford 的队列,所以最短的解决方案路径会更快找到。(以某种方式接近 Dijkstra 算法)
现在,我在堆中插入节点编号,因此默认的 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,因为这是我明白为什么添加这个比较函数会给出错误答案的唯一原因......
我的意思是,如果节点的顺序完全随机,为什么它会起作用,但如果它们按成本排序则不起作用......