/**
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-图论-最小路径
3D高斯泼溅实战:如何用自采数据集训练出高质量3D模型(附COLMAP避坑指南)
本文详细介绍了使用自采数据集训练高质量3D高斯泼溅模型的完整实战流程。从数据采集规范、COLMAP稀疏重建的深度配置与避坑指南,到数据格式转换及3DGS训练调优策略,提供了针对自采数据的关键参数调整与问题排查方案,帮助读者高效构建专属3D场景。
搜索与图论 - spfa 算法
spfa 算法
两张 300I Duo 部署 Qwen3.5‑32B
开发者成功使用两张华为300IDuo(共4颗Ascend310P3芯片)部署Qwen3/Qwen3.5的30B/32B模型,并公开详细步骤。关键点包括:硬件需两张300IDuo(每芯片44GB显存),软件需CANN≥24.1和MindIE2.3.0专用镜像。部署流程涵盖驱动安装、模型下载(需修改为FP16格式)、容器启动、张量并行配置(TP=4)等环节。实测显示每芯片显存占用20-35GB,系统稳定运行。该方案已在知乎等平台验证可行,适用于Qwen3.5-32B等同类模型。
RNA-Seq数据分析实战:从FastQC到STAR比对的完整流程(附避坑指南)
本文提供了RNA-Seq数据分析从FastQC质控到STAR比对的完整实战流程与避坑指南。详细解读了FastQC/MultiQC报告的关键指标,并重点阐述了STAR比对工具的核心参数设置、索引构建及性能优化策略,旨在帮助用户获得准确可靠的比对结果,为下游基因表达分析奠定坚实基础。
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,选择不跟新..
中科蓝讯(第一次使用指南)
中科蓝讯 新手指南
【智能算法】SPFA算法
SPFA算法,全称Shortest Path Faster Algorithm,是Bellman-Ford算法的一种队列优化形式,由西南交通大学段凡丁于1994年提出(尽管其证明存在错误,且队列优化的概念在Bellman-Ford算法提出后不久即已存在)。SPFA算法主要用于求解含有负权边的单源最短路径问题,并具备判断负权环的能力。
华为云CodeHub代码托管
什么是代码托管 代码托管(CodeHub)是面向软件开发者的基于Git的在线代码托管服务,是具备安全管控、成员/权限管理、分支保护/合并、在线编辑、统计服务等功能的云端代码仓库,旨在解决软件开发者在跨地域协同、多分支并发、代码版本管理、安全性等方面的问题。 代码托管具有以下特性 · 在线代码阅读、修改、提交,随时随地开发,不受地域限制。 · 在线分支管理,包含分支新建、切换、合并,实现多分支并行开发,效率高。 master分支:最为稳定,功能比较完整,随时可发布的代码。 develop分支:用于平时开
PHY6252开发实战:从零构建BLE串口透传应用
本文详细介绍了PHY6252开发板在BLE串口透传应用中的实战经验,包括开发环境搭建、BLE串口透传例程解析、AT指令集实现与扩展、数据透传机制优化以及常见问题排查指南。通过智能家居遥控器项目案例,展示了PHY6252在低功耗物联网设备开发中的实际应用。
SPFA算法详解
前置知识:Bellman-Ford算法 前排提示:SPFA算法非常容易被卡出翔。所以如果不是图中有负权边,尽量使用Dijkstra!(Dijkstra算法不能能处理负权边,但SPFA能) 前排提示*2:一定要先学Bellman-Ford! 0.引子 在Bellman-Ford算法中,每条边都要松弛\(n-1\)轮,还不一定能松弛成功,这实在是太浪费了。能不能想办法改进呢? 非常幸运,SPFA算法...
20.Labview使用子vi进行VI间的数据传递详解(模块化)
子VI(模块化)题主在题注中也提到, 子VI的建立只是为了减少程序的负担,那么我们当使用子VI的时候首先就要明确什么是子VI?什么样的程序可以作为子VI?首先我们来看NI官方给的定义,具体说明如下图所示:题主已经将重点画出来了,在官方的解释中将子VI定义为了模块化,大家可以看到创建模块化子VI的特点在于减少代码重复工作优化了程序的框架结构。把一个代码打包,需要的时候就拎出来让他处理处理,不需要的时候就让它躺在我的列表里就行了也不占用运行空间。那么创建子VI需要需要注意以下几点:①任何一个程序。
SPFA算法
一.算法简介 SPFA(Shortest Path Faster Algorithm)算法是求单源最短路径的一种算法,它是Bellman-ford的队列优化,它是一种十分高效的最短路算法。 很多时候,给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了。SPFA的复杂度大约是O(kE),k是每个点的平均进队次数(...
PC 端微信页面拆分及 JavaFx 使用
一、前言 对于一个知识点的学习过程来说,往往使用自己熟悉的工具或方式才更易于上手。因为所有同类型的知识点在抛出复杂的流程拨云见日后,所能得到的几乎都是同样的设计思想和实现理论。 在 Java 语言桌面版开发中,直至目前共提供了三套 UI 开发方式;Awt、Swing、JavaFx,以及一些扩展组件 SWT 等。在这三套 UI 组件中,JavaFx 是最新也是最为好用的,因为他提供了丰富的功能,以及...
Probability and Statistics - 4th edition
Probability and Statistics - 4th edition
spfa算法
spfa算法简介 spfa算法是shortest path fastest algorithm的缩写。再通常情况下,是一种比较高效的求解最短路的算法。spfa的本质是广度优先搜索,将图所有的边都遍历一遍。时间复杂度是O(m),其中m是图的边数。 spfa算法的用途 spfa算法用来解决单源最短路问题,可以求解从某个点开始,到图中其他所有点的最短距离。 spfa算法的实现步骤 实现spfa算法需要一个队列q,一个标记数组vis[N]用来标记某点是否已经被搜索过。数组dist[N],用来存储起点到..
Outlook Express 6 (OE6) for Win7/Win8/Win10
英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。
Dijkstra算法与SPFA算法
最近看了《算法笔记》上面关于最短路径的部分,学习了一种之前没见过的算法:SPFA。理论上SPFA算法会比Dijkstra快,顾而找了一题测试一下。 使用PAT A1072题,因为这题求最短路径的部分很单纯,没有其他的权,而且测试点的复杂度够高,能够看出时间上的差别。 题目链接 速度对比(重点看测试点4) Dijkstra速度 K一般为1或2,E是边数,就算他O(E)好了。 SPFA在很多教科书上都没有,主要是因为SPFA是中国人提出来的,外国人很少知道,所以就没有Dijkstra拿下算法那么热门,虽然不是很热门,但算法本身还是很好的。 SPFA是Bellman-ford的优化版,单源最短路径,可以检查出有没有负权...
2万+



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



