最短路优化
写在前面
上次讲了最短路的基础,但是像最短路这种博大精深(坑特别深)的算法。。。是肯定有优化的啦。这一篇是给有最短路基础的人看的,假如没有嘛。。可以看看我以前写的最短路基础
SPFA
我把这个算法挪到这边来写了,原因有两个:第一个是我上次懒得写了。。
第二个是这个算法比较难,所以放在了优化这边一起写,而且它本身就是对贝尔曼福德的优化。
不说废话了,let\'s begin
spfa 算法可以适用于负边权的情况,是 bellman-ford 的队列优化。
假设存在 G=<V,E>,dis[i]记录 V0 到 i 的最短距离,pre[i]记录从 V0 到 i 路径 上 i 的前面的一个顶点;
step1.将所有顶点对之间距离初始化为无穷大(dis[i][j]=无穷大),pre[i]=i, vis[i]=0,将源点入队;
step2.读取队头顶点 now,并将队头顶点 now 出队(记得消除标记),将与点 now 相连的所有点 next 进行松弛操作(还记得吗,上一篇讲过),更新 dis[next],另外,如果点 next 没有 在队列中,那么要将点 next 入队(记得标记),如果已经在队列中了,那么就不 用入队(如果某个顶点入队超过 V 次,则说明图中有负环,直接跳出);
step3.重复 step2,直到队空为止就完成了单源最短路的求解。
这是主要思路。
下面有个图解(无耻的转自某博客)