Dijkstra求最短路 (堆优化版)

Posted MoonSky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dijkstra求最短路 (堆优化版)相关的知识,希望对你有一定的参考价值。

 

 我们每次在找不在s中的距离最近的点都需要循环一次,这样的时间复杂度是0(n)的, 但是如果用小根堆来优化的话,那么时间复杂度会降到O(1),而且每个点的最短距离只会出现一次,会出冗余的情况,所以在出现冗余时,我们可以直接跳过。(觉得可以这么考虑,m条边都会进入队列,但是对于一个源点来讲只有最短的那条边会参加运算)

 

堆优化版本适用于:稀疏图

void add(int a, int b, int c)   // 创建边

    e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx++;


int dijstra()

    memset(dist, 0x3f, sizeof dist);    // 初始话距离
    dist[1] = 0;
    priority_queue<PII, vector<PII>, greater<PII> > heap;  // 小根堆
    heap.push(0,1);
    
    while(heap.size())   // *****
    
         PII t = heap.top(); heap.pop();
         int ver = t.second, distance = t.first;
         if(vis[ver]) continue;  //  如果if成立 说明当前的点在之前已经更新过了,现在是冗余备份,那么就不需要更新了。
         vis[ver] = true;
         
         for(int i = h[ver]; i != -1; i = ne[i]) 
         
             int j = e[i];
             if(dist[j] > dist[ver] + w[i])
             
                 dist[j] = dist[ver] + w[i];
                 heap.push(dist[j], j);
             
         
    
    if(dist[n] == 0x3f3f3f3f) return -1;
    return dist[n];

 

不要羡慕别人喝的饮料有各种颜色,其实未必有你的白开水解渴,

以上是关于Dijkstra求最短路 (堆优化版)的主要内容,如果未能解决你的问题,请参考以下文章

畅通工程续 hdu 杭电1874 dijkstra堆优化版最短路问题

850. Dijkstra求最短路 II

最短路-Dijkstra算法:朴素版&堆优化版(Java详解)

第k短路

Dijstra堆优化HDU 3986 Harry Potter and the Final Battle

dijkstra最短路算法(堆优化)