/**
SPFA: Shortest Path Faster Algorithm
看到名字不禁为之一颤,SPFA算法是西南交通大学段凡丁于1994年发表的。
SPFA 也是竞赛中最常见的算法之一,不仅仅用来解决带负权的单源最短路
而且是求解差分约束问题的专用算法,也常用它和最大流合作解决最小费问题
可以说SPFA 是 dijkstra 和 bellman 的结合体,功能可见一斑……
SPFA 算法的最坏复杂度为 O(2*E)。。
SPFA 和dijkstra 格式很接近,只是加了个队列或栈就变得无比神奇了。
这里用邻接表形式写下spfa 的模板
后面再介绍它的其它功能,这里只知道它和bellman 功能一样,仅仅快即可
*/
const int inf = 0x3f3f3f3f;
const int nMax = 1000;
const int eMax = 500000;
struct {
int v, w, next;
}edge[eMax];
int edgeHead[nMax], dis[nMax], n, ne; //n为点的个数, ne添边所用 //初始化edgeHead = 0 ne > 0
int vis[nMax], queue[nMax]; /** stack[nMax] */ //替换queue
void addEdge(int u, int v, int w) {
edge[ne].v = v;
edge[ne].w = w;
edge[ne].next = edgeHead[u];
edgeHead[u] = ne++;
}
int spfa(int s, int t) {
int i, head=0, tail=1 ; /** top = 0 */ //替换head , tail
for (i=0; i<=n; i++) {
dis[i] = inf;
vis[i] = false;
}
dis[s] = 0;
queue[0] = s;
while (tail != head) { /** (top) */ //替换(tail != head)
int u = queue[head++]; /** u = stack[top--] */ //替换
vis[u] = true; //这里可有可无……
for (i=edgeHead[u]; i; i=edge[i].next) {
int v = edge[i].v, w = edge[i].w;
if (dis[v] > dis[u]+w) {
dis[v] = dis[u] + w;
if (!vis[v]) {
vis[v] = true;
/******************/
queue[tail++] = v;
if (tail == nMax) //循环队列
tail = 0;
/** stack[++top] = v */ //替换
}
}
}
vis[u] = false; //这里是必须得有
/****************/
if (head == nMax) //stack不需要噢,循环队列
head = 0;
/****************/ //替换删除
}
return dis[t];
}
/**
注意: 添边时初始化 edgeHead = 0, ne > 0
将标有替换的地方替换则变为栈操作
判断正负权回路时,如果某点进入队列或栈的次数超过n 次则存在环
只需用cnt[nMax] 数组标记每个点进入队列次数即可
超级注意,只所以提供队列和栈两种操作是因为有些题卡队列,有些题卡堆栈
不过肯定有一种能过,这种情况经常遇到,要注意啊!!!!!!!!!!!!
*/
收藏于 2011-11-25
来自于百度空间相关推荐
Dijkstra与SPFA算法的不同之处对比
SPFA算法 此处为SPFA算法详解 用dis数组记录源点到有向图上任意一点距离,其中源点到自身距离为0,到其他点距离为 INF。将源点入队,并重复以下步骤: 1、队首x出队 2、遍历所有以队首为起点的有向边(x,i),若dis[x]+w(x,i)<dis[i],则更新dis[i] 3、如果点i不在队列中,则i入队 4、若队列为空,跳出循环;否则执行1 Dijkstra算法 此处为Dijkstra算法详解 清除所有点的标号; 设d[0]=0,其他d[i]=INF;//INF是一个很大的值,用来替代正无穷 循环n次 { 在所有未标号结点中,
SPFA算法(最短路径算法)
SPFA-图论-最小路径
Linux 音频驱动(六) ALSA音频驱动之PCM Write数据传递过程
目录1. 前言2. PCM Data Flow3. 总结 1. 前言 本文,我们将以回放(Playback,播放音频)为例,讲解PCM Data是如何从用户空间到内核空间,最后传递到Codec。 在Linux 音频驱动(一) ASoC音频框架简介中,我们给出了回放(Playback)PCM数据流示意图: 对于Linux来说,由于分为 user space 和kernel space,而且两者之间不能随便互相访问。因此用户如果播放音频,则需要调用copy_from_user()将用户数据从user spa
搜索与图论 - spfa 算法
spfa 算法
【Java】对接微信转账到零钱接口 Java微信商家转账 apiV3(该踩的雷都踩了)
配置apiv3依赖java代码。
COMSOL报错调试总结(不定期更新)
COMSOL报错调试总结1. 可定位错误1.1 除零错误1.2 未定义变量值1.3 边界条件/材料属性等缺失2. 难定位错误2.1. 装配期间内存不足 官方给的案例总是非常完美,运行流畅,结果完美。但是自己做模型时候就总是报错,而且不像自己coding的程序那样可以明确定位哪里出了bug。这里把我碰到的一些报错问题以及调试方法记录下来~ 部分来源于以下参考来源: http://wap.sciencenet.cn/blog-1467490-1118453.html?mobile=1 1. 可定位错误 以下错误
SPFA 算法总结
回顾一下使用邻接表的 SPFA 的算法 如上图所示: 假设原点是 1 ,也就是说 1 在队列中 将与 1 节点连接的节点放入队列中 此时更新 d[2]=3 , d[3]=9 , d[4]=7 , d[5]=3 将以上节点放入队列中 此时队列里有 2,3,4,5 节点 然后 2 出队,发现与 2 连接的有 3 号节点,更新 d[3]=5, 但是 3 节点在队列中,所以不再进行操作 之后 3 号节点出队,与 3 号节点连接的只有 4 号节点,但此时 d[4]=7<9+4,选择不跟新..
泰森多面体Voronoi 3D-V5.0 功能介绍
Abaqus Voronoi3D
【智能算法】SPFA算法
SPFA算法,全称Shortest Path Faster Algorithm,是Bellman-Ford算法的一种队列优化形式,由西南交通大学段凡丁于1994年提出(尽管其证明存在错误,且队列优化的概念在Bellman-Ford算法提出后不久即已存在)。SPFA算法主要用于求解含有负权边的单源最短路径问题,并具备判断负权环的能力。
JHU ICBM DTI Atlas纤维束模板介绍
JHU ICBM DTI atlas 纤维束的定位与功能介绍
lidar360 V8.0 & lidar360MLS V8.0雷达点云数据处理软件
机载林业 — 基于机载激光雷达点云数据提取一系列森林结构参数(如:高度分位数、叶面积指数、郁闭度等),分割单木并提取单木参数(包括树的位置、树高、胸径、枝下高、冠幅等属性),利用软件的多种回归分析功能可以结合地面调查数据反演森林生物量、蓄积量等功能参数。还可以生成等高线、山体阴影、坡度、坡向、粗糙度等多种产品。分类 — LiDAR360提供多种分类功能,包括地面点分类、模型关键点分类、选择区域地面点分类、机器学习模型分类(可高效地分离建筑、植被、路灯等通用类别)、深度学习模型分类、自定义深度学习分类等。
SPFA算法详解
前置知识:Bellman-Ford算法 前排提示:SPFA算法非常容易被卡出翔。所以如果不是图中有负权边,尽量使用Dijkstra!(Dijkstra算法不能能处理负权边,但SPFA能) 前排提示*2:一定要先学Bellman-Ford! 0.引子 在Bellman-Ford算法中,每条边都要松弛\(n-1\)轮,还不一定能松弛成功,这实在是太浪费了。能不能想办法改进呢? 非常幸运,SPFA算法...
基于 Mask R-CNN 的实例分割:从零开始构建一个强大的分割模型
在本文中,我们将介绍如何使用 Mask R-CNN(Region-based Convolutional Networks with Masks)实现实例分割。实例分割是计算机视觉中的一种任务,旨在识别并分割图像中的各个对象。我们将讨论如何准备数据集、配置 Mask R-CNN 模型并在自定义数据集上进行训练。
SPFA算法
一.算法简介 SPFA(Shortest Path Faster Algorithm)算法是求单源最短路径的一种算法,它是Bellman-ford的队列优化,它是一种十分高效的最短路算法。 很多时候,给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了。SPFA的复杂度大约是O(kE),k是每个点的平均进队次数(...
水文仿真软件:HEC-RAS (Hydrologic Engineering Center‘s River Analysis System)_(7).一维非稳态水力模型
自定义脚本是通过编程语言(如 Python)编写的一系列自动化任务,可以帮助用户更高效地处理数据和运行模型。编写脚本:使用 Python 或其他编程语言编写自定义脚本。集成脚本:将脚本集成到 HEC-RAS 中,实现自动化数据处理和模型运行。
复分析 阿尔福斯(Ahlfors) 第三版答案 英文
答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案
spfa算法
spfa算法简介 spfa算法是shortest path fastest algorithm的缩写。再通常情况下,是一种比较高效的求解最短路的算法。spfa的本质是广度优先搜索,将图所有的边都遍历一遍。时间复杂度是O(m),其中m是图的边数。 spfa算法的用途 spfa算法用来解决单源最短路问题,可以求解从某个点开始,到图中其他所有点的最短距离。 spfa算法的实现步骤 实现spfa算法需要一个队列q,一个标记数组vis[N]用来标记某点是否已经被搜索过。数组dist[N],用来存储起点到..
老版QQ原生表情gif动态
这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。
Dijkstra算法与SPFA算法
最近看了《算法笔记》上面关于最短路径的部分,学习了一种之前没见过的算法:SPFA。理论上SPFA算法会比Dijkstra快,顾而找了一题测试一下。 使用PAT A1072题,因为这题求最短路径的部分很单纯,没有其他的权,而且测试点的复杂度够高,能够看出时间上的差别。 题目链接 速度对比(重点看测试点4) Dijkstra速度 K一般为1或2,E是边数,就算他O(E)好了。 SPFA在很多教科书上都没有,主要是因为SPFA是中国人提出来的,外国人很少知道,所以就没有Dijkstra拿下算法那么热门,虽然不是很热门,但算法本身还是很好的。 SPFA是Bellman-ford的优化版,单源最短路径,可以检查出有没有负权...
2万+



被折叠的 条评论
为什么被折叠?



