我正在尝试实现Dijkstra的算法,但我遇到了一些麻烦。
void Graph::Dijkstra(int source)
{
// Initialize single source
[...]
// Initialize a priority queue with all vertices
[...]
// Main loop
while (!Queue.empty())
{
int u = Queue.top();
Queue.pop();
// Relax the edges
[...]
}
}
在源顶点之后,我的代码总是选择一个具有无限(100000)距离的顶点,即使有其他顶点具有非infinte距离。
我虽然优先级队列有指向我的顶点的指针,但每当我改变顶点的距离(v.d)时它都会更新。
答案 0 :(得分:1)
priority_queue
尝试在pop
上保持其不变量。你正在pop
之后放松顶点。进行以下更改:
while (!Queue.empty())
{
Vertex *u = Queue.top();
list<Edge>::iterator i;
for (i=u->adj.begin(); i!=u->adj.end(); ++i)
{
Vertex *v = &vertices[(*i).to];
Relax(u,v,(*i).w);
}
Queue.pop();
}