最短路算法笔记
最短路算法
最短路算法可大致分为三类:无负权边的单源最短路,有负权边的单源最短路和多源汇最短路
dijkstra 算法
dijkstra 算法是求无负权边的单源最短路的常用算法,基于贪心的思想
其过程大致为:
- 找到距离已经确定最短路的连通块的最近的点
- 把他加入已经确定最短路的连通块
- 用这个点去更新其他点的最短路
在此就不解释此算法的正确性
朴素版 dijkstra
我们可以看出,朴素版 dijkstra 的时间复杂度是 的
对于每次找到距离距离已经确定最短路的连通块的最近的点这一步操作我们可以用堆来实现
因此我们就得到了堆优化版的 dijkstra
堆优化版 dijkstra
void dijkstra() { priority_queue<PII, vector<PII>, greater<PII>> pq; memset(dis, 0x3f, sizeof(dis)); dis[s] = 0; pq.push({0, s}); while (pq.size()) { auto t = pq.top(); pq.pop(); int ind = t.second; if (vis[ind]) continue; vis[ind] = true; for (int i = h[ind]; i != -1; i = ne[i]) { if (dis[e[i]] > t.first + w[i]) { dis[e[i]] = t.first + w[i]; pq.push({dis[e[i]], e[i]}); } } } }
由于可以看出堆优化版 dijkstra 的时间复杂度是 的
所以我们在稠密图中跑朴素版 dijkstra ,在稀疏图中跑堆优化版 dijkstra
本文作者:张詠然
本文链接:https://www.cnblogs.com/zyrddd/p/17717108.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步