最短路算法总结
作者:
月亮上的保安_jm
,
2024-06-30 16:04:03
,
所有人可见
,
阅读 9
最短路算法总结
Dijkstra-朴素 $O(n^2)$
- 初始化距离数组,
dist[1] = 0, dist[i] = inf;
- for n次循环 每次循环确定一个min加入S集合中,n次之后就得出所有的最短距离
- 将不在S中dist_min的点->t
- t->S加入最短路集合
- 用t更新到其他点的距离
Dijkstra-堆优化 $O(mlogm)$
- 利用邻接表,优先队列
- 在
priority_queue<PII, vector<PII>, greater<PII>> heap;
中将返回堆顶
- 利用堆顶来更新其他点,并加入堆中类似宽搜
Bellman_ford $O(nm)$
- 注意连锁想象需要备份,
struct Edge{int a, b, c} e[M];
- 初始化dist, 松弛
dist[x.b] = min(dist[x.b], backup[x.a] + x.w);
- 松弛k次,每次访问m条边
Spfa $O(n)$ ~ $O(nm)$
- 利用队列优化仅加入修改过的地方
- for k次
- for 所有边利用宽搜模型去优化bellman_ford算法
- 更新队列中当前点的所有出边
Floyd $O(n^3)$
- 初始化d
- k, i, j 去更新d