我们每次在找不在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]; }