最短路径算法 4.SPFA算法(1)
今天所说的就是常用的解决最短路径问题最后一个算法,这个算法同样是求连通图中单源点到其他结点的最短路径,功能和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.在枚举所有点的那一步中,前提使用邻接表储存的图之后在枚举才行,否则时间复杂度将没有提升。
最短路径算法 4.SPFA算法(1)的更多相关文章
- 数据结构与算法--最短路径之Bellman算法、SPFA算法
数据结构与算法--最短路径之Bellman算法.SPFA算法 除了Floyd算法,另外一个使用广泛且可以处理负权边的是Bellman-Ford算法. Bellman-Ford算法 假设某个图有V个顶点 ...
- 最短路径——Bellman-Ford算法以及SPFA算法
说完dijkstra算法,有提到过朴素dij算法无法处理负权边的情况,这里就需要用到Bellman-Ford算法,抛弃贪心的想法,牺牲时间的基础上,换取负权有向图的处理正确. 单源最短路径 Bellm ...
- Bellman-Ford算法与SPFA算法详解
PS:如果您只需要Bellman-Ford/SPFA/判负环模板,请到相应的模板部分 上一篇中简单讲解了用于多源最短路的Floyd算法.本篇要介绍的则是用与单源最短路的Bellman-Ford算法和它 ...
- Bellman-ford算法、SPFA算法求解最短路模板
Bellman-ford 算法适用于含有负权边的最短路求解,复杂度是O( VE ),其原理是依次对每条边进行松弛操作,重复这个操作E-1次后则一定得到最短路,如果还能继续松弛,则有负环.这是因为最长的 ...
- 最短路径算法之四——SPFA算法
SPAF算法 求单源最短路的SPFA算法的全称是:Shortest Path Faster Algorithm,该算法是西南交通大学段凡丁于1994年发表的. 它可以在O(kE)的时间复杂度内求出源点 ...
- 图论-最短路径--3、SPFA算法O(kE)
SPFA算法O(kE) 主要思想是: 初始时将起点加入队列.每次从队列中取出一个元素,并对所有与它相邻的点进行修改,若某个相邻的点修改成功,则将其入队.直到队列为空时算法结束. 这个算 ...
- 题目1008:最短路径问题(SPFA算法)
问题来源 http://ac.jobdu.com/problem.php?pid=1008 问题描述 给定一个G(V,E)有向图,起点s以及终点t,求最短路径. 问题分析 典型的单源最短路径问题,可以 ...
- 最短路径问题---Floyed(弗洛伊德算法),dijkstra算法,SPFA算法
在NOIP比赛中,如果出图论题最短路径应该是个常考点. 求解最短路径常用的算法有:Floyed算法(O(n^3)的暴力算法,在比赛中大概能过三十分) dijkstra算法 (堆优化之后是O(MlogE ...
- [hihoCoder] #1093 : 最短路径·三:SPFA算法
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 万圣节的晚上,小Hi和小Ho在吃过晚饭之后,来到了一个巨大的鬼屋! 鬼屋中一共有N个地点,分别编号为1..N,这N个地点之 ...
随机推荐
- php 获取毫秒时间戳
function getMsec(){//返回毫秒时间戳 $arr = explode(' ',microtime()); $hm = 0; foreach($arr as $v){ $hm += f ...
- how to determint wether two column equals
question: How to determint wether two column equals? Answer: Table one:RecordId = 1,CommonId = 5,Ap ...
- 关于 org.hibernate.TransientObjectException 异常
在Hibernate的关联关系中,如果一个对象A 持有 对象 B 的引用,如果先保存 A ,再保存B,那么会出现 org.hibernate.TransientObjectException 异常. ...
- 【[HAOI2008]木棍分割】
没写过几道的前缀和优化\(dp\) 第一问是小学生难度的二分 第二问就直接\(dp\)了 设\(dp[i][j]\)表示当前分割点在\(i\)之后,前面一共分割了\(j\)段的方案数 利用前缀和单调性 ...
- 【luogu P3398 仓鼠找sugar】 题解
题目链接:https://www.luogu.org/problemnew/show/P3398 辣鸡树剖1300ms 倍增大法吼啊 #include <cstdio> #include ...
- AngularJS 二 指令介绍
初始化AngularJS框架 ng-app指令: 在NG-程序指令是AngularJS应用程序的起点.它自动初始化AngularJS框架.AngularJS框架将在加载整个文档之后首先检查HTML文档 ...
- 火狐 SSL 收到了一个弱临时 Diffie-Hellman 密钥
火狐 SSL 收到了一个弱临时 Diffie-Hellman 密钥 最近在用FireFox 调试时使用Https,连接 https网址 时发生错误. 在服务器密钥交换握手信息中 SSL 收到了一个 ...
- 'version' contains an expression but should be a constant. @ line 13, column 11问题的解决
<modelVersion>4.0.0</modelVersion> <groupId>cy.nad.cyg</groupId> <artifac ...
- 基于 UIImagePickerController 的拓展封装 - iOS
基于 UIImagePickerController 的拓展,分别支持调用相机.相册的功能,其中相机可以设置默认调用前后摄像头; 简单对此进行了封装和实现,其中还有很多点可以继续挖掘和优化,该版本具体 ...
- 蓝牙实现对等网络连接 <GameKit/GameKit.h>
/* 1.设置UI界面 2.引入框架 3.点击选择照片 4.连接蓝牙设备 5.实现蓝牙的代理方法 6.发送照片 */ #import "ViewController.h" #imp ...