Dijkstra求最短路 (堆优化版)

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];
}

 

上一篇:图论:最小生成树的求法


下一篇:在 c++ 项目中使用 grpc —— 无管理员权限