【发布时间】:2018-07-08 22:38:15
【问题描述】:
我正在尝试为 Dijkstra 的算法编写用户定义对象的邻接列表。
这个项目是我工作的一部分,所以我必须保持一般性。
我正在使用邻接列表和 STL 优先级队列
这是我比较不同节点的方式
class priorityQueueCompareNodes
{
public:
bool operator() ( const Node& leftSideNode,
const Node& rightSideNode )
{
return leftSideNode.cost > rightSideNode.cost;
}
};
这就是我弹出并插入优先级队列的方式。
//get the node with the lowest cost from the priority queue
Node closestNode = priorityQueue.top();
//pop this node from the queue
priorityQueue.pop();
当我放松边并将成本更改为不同节点时,我会更改邻接列表,而不是优先级队列。
我的问题是如何更改优先级队列中的值,以便每次放松边权重和更改距离/父级时都有更新的优先级队列。
谢谢大家。
【问题讨论】:
-
这个项目是我工作的一部分 -- 请注意boost 已经实现了 Dijkstra 的算法。
-
如何更改优先级队列中的值,以便每次放松边权重和更改距离/父级时都有更新的优先级队列。 -- 换句话说, “每次更改
时如何更改 中的值”。这就是你的问题吗?如果是这样,观察者模式,使用 std::shared_ptr,根据您的要求,有多种方法可以给猫剥皮。 -
一种方法是使用 std::set,删除元素并使用新键重新插入。这在 O(log n) 中运行。
-
我不知道这是否是一个好习惯,但我所做的只是当我找到一个较短的节点路径时将一个新元素插入优先级队列。新条目将首先得到处理,路径较长的旧条目将被忽略,因为该节点已经被访问过。
-
@FeiXiang 可以做到这一点,但是根据可能正在处理的特定图表类型,优先级队列的空间使用量可能会变得非常大。