今天所说的就是常用的解决最短路径问题最后一个算法,这个算法同样是求连通图中单源点到其他结点的最短路径,功能和Bellman-Ford算法大致相同,可以求有负权的边的图,但不能出现负回路。但是SPFA算法的时间复杂度是O(kE),k是常数,平均值为2,E是边数。我们可以看到SPFA算法的时间复杂度远远低于Bellman-Ford算法,因此常常选择此算法而不是Bellman算法(虽然其复杂度没有被严格的数学证明)。

简单的说SPFA是将Bellman-Ford算法结合了队列的实现,从而减少了很多冗余的计算。

文字描述如下:初始时将起点加入队列。每次从队列中取出一个元素,并对所有与它相邻的点进行修改,若某个相邻的点修改成功,则将其入队。直到该队列为空时算法结束。

伪代码描述:

dis[i]记录起点s到i的最短路径,m[i][j]记录连接i、j边的长度,pre[v]记录前驱结点。

t[1..n]为队列,头指针是head,尾指针为tail。

布尔数组 e[1..n]记录一个点是否现在存在在队列当中。

初始化:dis[s]=0,dis[v]=∞,memset(e,false,sizeof(e));

起点入队t[1]=s;head=0;tail=1;e[s]=true;

do

{

1.头指针向下移,取出点u。

2.e[u]=false;已经被取出队列。

3.for所有与u相连的点v

if(dis[v]>dis[u]+m[u][v]){

dis[v]=dis[u]+m[u][v];

pre[v]=u;

if(!e[v])// v不在队列中,v入队

{

尾指针下移,v入队;

e[v]=true;

}

}

}while(head<tail);

注意点:

1.因为队列的大小不可知并且容易超过预计,所以采用循环队列的思想,即队列长度不需要开的很大。

2.算法感觉和广搜类似,但是与广搜不同的是,广搜出列的元素不会在入列,而这里会根据需要一直调整队列中的元素。

具体代码将在下一题中运用到,这里就不专门写了。

3.在枚举所有点的那一步中,前提使用邻接表储存的图之后在枚举才行,否则时间复杂度将没有提升。

最新文章

  1. 基于MySQL MEB的备份恢复
  2. Using Celery with Djang
  3. C# 文件选择对话框,Unity3d文件保存对话框
  4. IOS9 新加关键字 nullable、nonnull、null_unspecified、null_resettable
  5. markdown学习笔记 (一)
  6. 关于FireMonkey TGrid赋值的一点小研究
  7. 关于C指针
  8. AX在query中添加自己的函数
  9. Hive 接口介绍(Web UI/JDBC)
  10. yarn队列提交spark任务权限控制
  11. linux0.12 编译过程
  12. php 依据字符串生成相应数组方法
  13. 自写的LastPos,寻找字符串里的最后一个字符,RTL里没有提供这个函数——Delphi的String下标是从1开始的
  14. Javascript DOM 01 基础篇
  15. IIS服务器 远程发布(Web Deploy)配置 VS2010 开发环境 Windows Server 2008服务器系统
  16. js 各种常用js验证
  17. 解决Ubuntu不能连接xshell
  18. URI和URL差别以及相对路径和绝对路径的差别
  19. java多线程(八)-死锁问题和java多线程总结
  20. ASP.NET MVC框架开发系列教程

热门文章

  1. vue + element-ui 制作tab切换(适用于单页切换不同标记显示不同内容)
  2. 用大白话告诉你什么是Event Loop
  3. url规范化:解决从baidu.com到www.baidu.com的
  4. 如何在Chrome development tool里查看C4C前台发送的请求细节
  5. 线程概念的外延 Threading Terminology-What Are Threads
  6. 【洛谷P3205】[HNOI2010]CHORUS 合唱队
  7. Python—面向对象06 内置方法
  8. $_GET 与 $POST
  9. Restframework框架总结及restful规范
  10. Java数据结构——二叉树 增加、删除、查询