我认为c ++优先级队列不是dijkstra队列的正确结构,因为它不包含容易查找或删除元素的功能。
正确的结构是fibonacci堆,但std库中没有。
有没有人建议更好的c ++实现结构?
答案 0 :(得分:0)
您可以使用std::set
并存储一对< distance,vertex>在里面。要查找和删除元素,您可以保持距离数组中的每个顶点或std::vector
以获得一对<距离,顶点>对于给定的顶点快速。最接近的未访问顶点始终位于集合的第一个元素中(并且可以使用set.begin()
获得)。
答案 1 :(得分:0)
对于大多数实际用途,基于std::priority_queue
的实现对于稀疏图来说已经足够了。以这种方式实现Dijkstra的运行时为O(E log V)
。如果你有足够密集的图形,你可以简单地使用Dijkstra算法的基本O(V*V)
版本。随着图形越来越密集,Fib-heap版本的渐近性更接近于vanilla实现。