将节点引用到优先级队列(迭代器)中

Refer to node into a priority queue (iterator)

本文关键字:迭代器 队列 优先级 节点 引用      更新时间:2023-10-16

我试图用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是边的数量)。