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

C++ 将节点引用到优先级队列(迭代器),c++,C++,我试图用一个函数来实现Dijkstra的算法(因为我需要跟踪距离源节点最近的节点) 问题是:当探索一个节点时,它可能会链接到优先级队列中尚未发现的另一个节点(即,链接到优先级队列的一个元素) 优先级队列似乎不支持迭代器,在发现与之关联的节点时,如何引用优先级队列元素?std::priority\u queue既不支持迭代器,也不支持降低/提高节点优先级的接口:仅更改元素的优先级不会更新数据结构。您需要的是基于节点的版本的std::priority\u queue。在中有用于此目的的优先级队列 虽

我试图用一个函数来实现Dijkstra的算法(因为我需要跟踪距离源节点最近的节点)

问题是:当探索一个节点时,它可能会链接到优先级队列中尚未发现的另一个节点(即,链接到优先级队列的一个元素)

优先级队列似乎不支持迭代器,在发现与之关联的节点时,如何引用优先级队列元素?

std::priority\u queue
既不支持迭代器,也不支持降低/提高节点优先级的接口:仅更改元素的优先级不会更新数据结构。您需要的是基于节点的版本的
std::priority\u queue
。在中有用于此目的的优先级队列

虽然它的复杂性不太准确,但您可以使用Dijkstra算法的
std::priority_queue
:不存储节点,而是存储从访问节点到可能未访问节点的边,优先级为使用给定边时目标节点的距离。当弹出一个元素时,您需要检查该节点以前是否被访问过。复杂性将是
O(m log m)
而不是
O(m log n)
,尽管(
n
是节点数,
m
是边数).

std::priority\u queue
既不支持迭代器,也不支持降低/提高节点优先级的接口:仅更改元素的优先级不会更新数据结构。您需要的是基于节点的版本的
std::priority\u queue
。在中有用于此目的的优先级队列


虽然它的复杂性不太准确,但您可以使用Dijkstra算法的
std::priority_queue
:不存储节点,而是存储从访问节点到可能未访问节点的边,优先级为使用给定边时目标节点的距离。当弹出一个元素时,您需要检查该节点以前是否被访问过。复杂性将是
O(m log m)
而不是
O(m log n)
,尽管(
n
是节点数,
m
是边数)。

谢谢,但为什么是O(n log m)?您能解释一下复杂性吗?从
logn
logm
的变化是由于优先级队列存储了可能多个边,而不是最多所有节点。系数
n
实际上可能是错误的:按
m
的顺序插入了边,这使得它更像
O(m log m)
而不是
O(m log n)
具有优先级可以更改元素的优先级。谢谢,但是为什么O(n log m)?您能解释一下复杂性吗?从
logn
logm
的变化是由于优先级队列存储了可能多个边,而不是最多所有节点。系数
n
实际上可能是错误的:按
m
的顺序插入了边,这使得它更像
O(m log m)
而不是
O(m log n)
,优先级可以改变元素的优先级。