有关最短路(spfa和dijkstra)

主要是为了方便自己忘记的时候复习一遍,

不适合初学者

全部内容摘自他人博客

 

 

spfa:

有关最短路(spfa和dijkstra)_第1张图片

上图来自此处

 

dijkstra:

有关最短路(spfa和dijkstra)_第2张图片

 

有关最短路(spfa和dijkstra)_第3张图片

 

有关最短路(spfa和dijkstra)_第4张图片

 

上图来自此处

 

 

算法思路对比

  • Dijkstra+heap是用小根堆,每次取出d最小的点,来更新距离,那么这个点来说,最小距离就是当前的d。
  • SPFA是用双端队列,每次取出队头,来更新距离,它之后可能还会入队。它是一种动态逼近法,因为每次松弛距离都会减小,所以松弛一定会有结束的。如果一个点入队超过n次就是存在负环。

复杂度分析对比

Dijkstra+heap

  • 因为是堆,取队头需要O(lgV)。
  • 松弛边时,因为点的d改变了,所以点v需要以新距离重新入堆,O(lgV),总共O(ElgV)。
  • 因此总的是O((V+E)lgV)
  •  

SPFA

  • 论文证明也不严格。复杂度不太好分析。
  • 总的是O(kE)。k大概为2。
  • 复杂度应该是 O(VE)

适用场景

如果是稠密图,Dijkstra+heap比SPFA快。稀疏图则SPFA更快。SPFA可以有SLF和LLL两种优化,SLF就是d比队头小就插入队头,否则插入队尾。

另外,Dijkstra和Prim也很相似,它们的区别主要是d的含义,前者是到s的临时最短距离,后者是到树的临时最短距离,相同点是,每次找d最小的更新其它点的距离。

 

以上语句来自此处

你可能感兴趣的:(最短路)