c ++ std :: priority_queue是dijkstra队列的正确结构

时间:2014-06-28 09:47:28

标签: c++ queue dijkstra fibonacci-heap

我认为c ++优先级队列不是dijkstra队列的正确结构,因为它不包含容易查找或删除元素的功能。

正确的结构是fibonacci堆,但std库中没有。

有没有人建议更好的c ++实现结构?

2 个答案:

答案 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实现。