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堆优化版最短路问题
最短路-Dijkstra算法:朴素版&堆优化版(Java详解)