SPFA算法求单源最短路径
算法简介:
SPFA算法是应用于有向图上的一种算法,常用于求出从源点s到其它所有点的最短路径。相对于Dijkstra的O(n^2)的复杂度,SPFA的复杂度仅仅与边有关,为O(KE),其中E为该图的边数,且可以证明K < 2,故对于稀疏图来说,SPFA相较于Dijkstra要快上不少。
算法思想:
SPFA算法是基于广搜的思想实现它O(KE)的复杂度的。这里我用vector存放从每个点到其它点的可能路径,这种基于邻接表的思想相对于邻接矩阵省下了不少空间。最开始先将源点s放入队列,将表示点与源点之间的距离最小值的数组d[s]设为0,其余点的的距离设为inf,同时标记数组p[s]设为1。对于现在的节点的可能路径上能到达的每一个节点,我们进行relax松弛操作,对于每一次所能到达的节点更新最优值,同时当当前节点没有入队的时候,将它放入队列并做好标记。当队列为空的时候,则已经找到最优值,这时候统计d数组即为所求。
代码实现:
#include<iostream> #include<cstdio> #include<vector>