- 定义集合S={源点s+已经确定了最短路径的点vi}
- 初始将源点s以及由s直接到达的点丢入集合,定义dist[v]为当前s到v的最短路径长度,改路径上的点进经过S中的点。
- 路径按照非递减的顺序生成。
- 每次从未收录的点中寻找dist值最小的点,将其收入集合S。(贪心)
- 连通图中当所有点都已收入集合S,s到其余点的最短路径求解完成。
- 正确性(反证法):假设从未收录的点中选出的dist值最小的点v其最短路径不能被确定,则存在路径s→w→v<s→vi→v,首先w不可能在集合S中,否则不满足v的dist值最小,若w在S外,按照之前的寻找方法,则有dist[w]>dist[v],dist[w]+wi>dist[v]一定成立。由此证明这一做法的正确性,同时也证明了为何dijkstra不能处理带有负权边的图。
- Dijkstra运行原理与之前所用模板的对应:若(d[u]==x.d)成立,则u为S中的元素(可反证),这一判断成立可对应上述原理中的将v加入S;每一次松弛(为优先队列添加元素)可对应从未收录点中寻找dist值最小的点的过程。整体上可看成不断的从S中的点向外探索,每条边仅会被遍历一次,每个S中的点仅向外拓展一次。
- 时间复杂度(摘录):堆优化:O(|V|log|V|+|E|log|V|),稀疏图效果好。直接扫描所有未收录点:O(|V|^2+|E|),稠密图效果好。
关于Dijkstra算法运行原理的一些整理
最新推荐文章于 2022-04-20 21:10:04 发布