繁体   English   中英

dijkstra算法优先级队列

[英]dijkstra algorithm priority queue

当我们使用优先队列编写 dijkstra 算法时,为什么我们不检查访问节点?

while (!pq.empty())
    {
        
        int u = pq.top().second;
        pq.pop();
 
        // Get all adjacent of u.
        for (auto x : adj[u])
        {
            int v = x.first;
            int weight = x.second;
 
            if (dist[v] > dist[u] + weight)
            {
                dist[v] = dist[u] + weight;
                pq.push(make_pair(dist[v], v));
            }
        }

它确实检查了dist[v]中节点的先前值,我假设它存储了从根(或u )到节点v的当前最佳距离。 如果找到一条到v的新路径比之前的最短路径短,则将其重新插入优先级队列,因为它现在可能提供到其他节点的更短路径。 如果这个到v的新距离比之前的长,那么它就不管了。 这就是为什么在实现中没有else的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM