我正在尝试使用priority_queue实现Dijkstra的算法(因为我需要跟踪到源节点的最近节点)。
问题是:在探索节点时,可能会发生链接到尚未在优先级队列中发现的另一个节点(即优先级队列的元素)。
似乎优先级队列不支持迭代器,在发现与之关联的节点时,如何引用到优先级队列元素?
答案 0 :(得分:0)
std::priority_queue<T>
既不支持迭代器也不支持降低/增加节点优先级的接口:仅更改元素的优先级不会更新数据结构。您需要的是基于节点的std::priority_queue<T>
版本。 Boost中有专门用于此目的的队列。
虽然它不会很复杂,但可以使用std::priority_queue<T>
用于Dijkstra的算法:而不是存储您存储边缘的节点从访问节点到可能未访问的节点,优先级是使用给定边缘时目标节点的距离。弹出元素时,您需要检查之前是否访问过该节点。复杂性将是O(m log m)
而不是O(m log n)
,但(n
是节点数,m
是边数。)