关于Dijkstra算法运行原理的一些整理

  • 定义集合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|),稠密图效果好。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈希表扁豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值