使用priority_queue在CPP中实现Dijkstra

时间:2014-06-30 04:33:16

标签: c++ priority-queue dijkstra

我正在尝试实现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)时它都会更新。

1 个答案:

答案 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();
    }