将节点引用到优先级队列(迭代器)中
Refer to node into a priority queue (iterator)
我试图用priority_queue实现Dijkstra的算法(因为我需要跟踪离源节点最近的节点)。
问题是:当探索一个节点时,它可能会链接到优先级队列中尚未发现的另一个节点(即,链接到优先级排队的元素)。
优先级队列似乎不支持迭代器,当发现与之相关的节点时,我如何引用优先级队列元素?
std::priority_queue<T>
既不支持迭代器,也不支持降低/增加节点优先级的接口:仅仅更改元素的优先级不会更新数据结构。您需要的是一个基于节点的std::priority_queue<T>
版本。Boost中有用于此目的的优先级队列。
尽管它的复杂性不太好,但您可以使用std::priority_queue<T>
来执行Dijkstra的算法:您可以存储从已访问节点到可能未访问节点的边,而不是存储节点,优先级是使用给定边时目标节点的距离。当弹出一个元素时,您需要检查该节点以前是否被访问过。复杂度将是O(m log m)
而不是O(m log n)
(n
是节点的数量,m
是边的数量)。
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 如何在c++迭代器类型中包装std::chrono
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 对于set上的循环-获取next元素迭代器
- 为什么output_editor Concept不需要output_e迭代器标记
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 使用迭代器时如何访问对象在向量中的位置?
- std::vector::迭代器是否可以合法地作为指针
- 跟随整数索引列表的自定义类迭代器
- 不明白迭代器,引用和指针失效,一个例子
- 为什么某些 STL 容器(堆栈、队列、优先级队列)不支持迭代器?
- 优先级队列(使用 pairs<int,int> ) 根据 for 循环迭代器的顶级元素
- 使用循环队列和迭代器自动换行
- 通过许多不同类型的队列进行迭代器
- 迭代器实现 -(链表队列)
- 提升优先级队列迭代器
- 将节点引用到优先级队列(迭代器)中