SPFA算法

SPFA:

对于spfa算法,摘自百度百科的一段话:
{SPFA(Shortest Path Faster Algorithm)(队列优化)算法是求单源最短路径的一种算法,在Bellman-ford算法的基础上加上一个队列优化,减少了冗余的松弛操作,是一种高效的最短路算法。}

注意他是一个队列优化,也有点像bfs,是在Bellman-ford算法的优化,也是一种高效的最短路算法一般是求单源最短路径

单源最短路径是指求出一个点到其他所有点的距离,叫做求单源最短路径。


那这种算法如何实现呢?其核心思想是指:用一个先进先出的d数组保存需要优化的节点,优化时调出队首,用dis[head]去判断head所相通的顶点,若有调整,则将dis[j]改小,并将j入队,反复循环,反复从当前最优的点去优化其他的点,通过当前点的最短路径从而改变其他点的最短路径,这就是spfa的精华。而最后的dis数组在一步步的变优之后,最后的答案就是最短路径。


fillchar(dis,sizeof(dis),5);    //接下来的5行都是初始化。	
dis[k]:=0;			
d[1]:=k;			//这指接下来的dis数组中的数都是以这个点为源点到目标点的最短距离。
head:=0;
tail:=1;
while head<tail do
begin
	inc(head);
        t:=d[head];		//找出当前需要改变其他点最短路径的点。
        for i:=1 to a[t,0] do   	
        	if dis[a[t,i]]>dis[t]+b[t,i] then	//spfa的精华所在,更新最短路.
                begin
                	dis[a[t,i]]:=dis[t]+b[t,i];更新
                        inc(tail);
                        d[tail]:=a[t,i];//加入队列,来更新其他的最短路
                end;   
end;

总结:

spfa,优点是速度快,效率高,比较好实现,要好好理解其中心思想。


时间复杂度:O(me), 其中m为所有顶点进队的平均次数,可以证明m一般小于等于2:m其实是一个不容易事先分析出来的数,但它确是一个随图的不同而略有不同的常数.所谓常数,就是与e无关,与m,n也无关,仅与边的权值分布有关.一旦图确定,权值确定,原点确定,m就是一个确定的常数.所以SPFA算法复杂度不变,为O(e).

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值