SPFA 算法

java实现SPFA算法 1 问题描述 何为spfa(Shortest Path Faster Algorithm)算法? spfa算法功能:给定一个加权连通图,选取一个顶点,称为起点,求取起点到其它所有顶点之间的最短距离,其显著特点是可以求含负权图的单源最短路径,且效率较高。(PS:引用自百度百科:spfa是求单源最短路径的一种算法,它还有一个重要的功能是判负环(在差分约束系统中会得以体现),在Bellman-ford算... 阅读详情
/**
    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
来自于百度空间

SPFA算法详解及模板 写在前面我们现在熟悉的Dijkstra算法基本思路是:每次寻找已知节点到达未知节点距离最短的一个节点,那么这个位置节点的最短距离我们就知道了,这个未知节点变为已知节点,再去更新未知节点的距离......那么这样我们就需要寻找N-1次就可以找到最终的答案,因为每次我们都会得到一个点的最短距离,当然,Dijkstra算法因为每次都要去找距离已知点中距离最短的点,那么我们就可以使用优先队列来进行优化,这... 阅读详情

相关推荐

Dijkstra与SPFA算法的不同之处对比

SPFA算法 此处为SPFA算法详解 用dis数组记录源点到有向图上任意一点距离,其中源点到自身距离为0,到其他点距离为 INF。将源点入队,并重复以下步骤: 1、队首x出队 2、遍历所有以队首为起点的有向边(x,i),若dis[x]+w(x,i)&lt;dis[i],则更新dis[i] 3、如果点i不在队列中,则i入队 4、若队列为空,跳出循环;否则执行1 Dijkstra算法 此处为Dijkstra算法详解 清除所有点的标号; 设d[0]=0,其他d[i]=INF;//INF是一个很大的值,用来替代正无穷 循环n次 { 在所有未标号结点中,

SPFA算法(最短路径算法)

SPFA-图论-最小路径

m0_64045085的博客 2万+

3D高斯泼溅实战:如何用自采数据集训练出高质量3D模型(附COLMAP避坑指南)

本文详细介绍了使用自采数据集训练高质量3D高斯泼溅模型的完整实战流程。从数据采集规范、COLMAP稀疏重建的深度配置与避坑指南,到数据格式转换及3DGS训练调优策略,提供了针对自采数据的关键参数调整与问题排查方案,帮助读者高效构建专属3D场景。

g9h0i1的博客 977

搜索与图论 - spfa 算法

spfa 算法

每天进步一点点! 6257

两张 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等同类模型。

evering的博客 2255

RNA-Seq数据分析实战:从FastQC到STAR比对的完整流程(附避坑指南)

本文提供了RNA-Seq数据分析从FastQC质控到STAR比对的完整实战流程与避坑指南。详细解读了FastQC/MultiQC报告的关键指标,并重点阐述了STAR比对工具的核心参数设置、索引构建及性能优化策略,旨在帮助用户获得准确可靠的比对结果,为下游基因表达分析奠定坚实基础。

weixin_29290259的博客 92

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&lt;9+4,选择不跟新..

C_Dreamy的博客 5433

中科蓝讯(第一次使用指南)

中科蓝讯 新手指南

qq_48579018的博客 1万+

【智能算法】SPFA算法

SPFA算法,全称Shortest Path Faster Algorithm,是Bellman-Ford算法的一种队列优化形式,由西南交通大学段凡丁于1994年提出(尽管其证明存在错误,且队列优化的概念在Bellman-Ford算法提出后不久即已存在)。SPFA算法主要用于求解含有负权边的单源最短路径问题,并具备判断负权环的能力。

大雨淅淅的博客 2538

华为云CodeHub代码托管

什么是代码托管 代码托管(CodeHub)是面向软件开发者的基于Git的在线代码托管服务,是具备安全管控、成员/权限管理、分支保护/合并、在线编辑、统计服务等功能的云端代码仓库,旨在解决软件开发者在跨地域协同、多分支并发、代码版本管理、安全性等方面的问题。 代码托管具有以下特性 · 在线代码阅读、修改、提交,随时随地开发,不受地域限制。 · 在线分支管理,包含分支新建、切换、合并,实现多分支并行开发,效率高。 master分支:最为稳定,功能比较完整,随时可发布的代码。 develop分支:用于平时开

LUJINYUANA的博客 1万+

PHY6252开发实战:从零构建BLE串口透传应用

本文详细介绍了PHY6252开发板在BLE串口透传应用中的实战经验,包括开发环境搭建、BLE串口透传例程解析、AT指令集实现与扩展、数据透传机制优化以及常见问题排查指南。通过智能家居遥控器项目案例,展示了PHY6252在低功耗物联网设备开发中的实际应用。

weixin_29183637的博客 313

SPFA算法详解

前置知识:Bellman-Ford算法 前排提示:SPFA算法非常容易被卡出翔。所以如果不是图中有负权边,尽量使用Dijkstra!(Dijkstra算法不能能处理负权边,但SPFA能) 前排提示*2:一定要先学Bellman-Ford! 0.引子 在Bellman-Ford算法中,每条边都要松弛\(n-1\)轮,还不一定能松弛成功,这实在是太浪费了。能不能想办法改进呢? 非常幸运,SPFA算法...

qq_14886903的博客 6298

20.Labview使用子vi进行VI间的数据传递详解(模块化)

子VI(模块化)题主在题注中也提到, 子VI的建立只是为了减少程序的负担,那么我们当使用子VI的时候首先就要明确什么是子VI?什么样的程序可以作为子VI?首先我们来看NI官方给的定义,具体说明如下图所示:题主已经将重点画出来了,在官方的解释中将子VI定义为了模块化,大家可以看到创建模块化子VI的特点在于减少代码重复工作优化了程序的框架结构。把一个代码打包,需要的时候就拎出来让他处理处理,不需要的时候就让它躺在我的列表里就行了也不占用运行空间。那么创建子VI需要需要注意以下几点:①任何一个程序。

关注我,更多技术问题欢迎私聊~ 3516

SPFA算法

一.算法简介 SPFA(Shortest Path Faster Algorithm)算法是求单源最短路径的一种算法,它是Bellman-ford的队列优化,它是一种十分高效的最短路算法。 很多时候,给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了。SPFA的复杂度大约是O(kE),k是每个点的平均进队次数(...

孙荣达的博客 2万+

PC 端微信页面拆分及 JavaFx 使用

一、前言 对于一个知识点的学习过程来说,往往使用自己熟悉的工具或方式才更易于上手。因为所有同类型的知识点在抛出复杂的流程拨云见日后,所能得到的几乎都是同样的设计思想和实现理论。 在 Java 语言桌面版开发中,直至目前共提供了三套 UI 开发方式;Awt、Swing、JavaFx,以及一些扩展组件 SWT 等。在这三套 UI 组件中,JavaFx 是最新也是最为好用的,因为他提供了丰富的功能,以及...

bugstack虫洞栈 3609

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],用来存储起点到..

qq_41729237的博客 1万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Dijkstra算法与SPFA算法

最近看了《算法笔记》上面关于最短路径的部分,学习了一种之前没见过的算法:SPFA。理论上SPFA算法会比Dijkstra快,顾而找了一题测试一下。 使用PAT A1072题,因为这题求最短路径的部分很单纯,没有其他的权,而且测试点的复杂度够高,能够看出时间上的差别。 题目链接 速度对比(重点看测试点4) Dijkstra速度 ![image.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9jZG4ubmxhcmsuY29tL3l1cXVlLzAvMjAyMC9w

语阑的博客 1679

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

图论算法——SPFA算法

SPFA算法是单源最短路径的最快算法,时间复杂度是O(KE)K一般为1或2,E是边数,就算他O(E)好了。 SPFA在很多教科书上都没有,主要是因为SPFA是中国人提出来的,外国人很少知道,所以就没有Dijkstra拿下算法那么热门,虽然不是很热门,但算法本身还是很好的。 SPFA是Bellman-ford的优化版,单源最短路径,可以检查出有没有负权...

diuguo0406的博客 754
上一篇: 二分图匹配的扩展问题
下一篇: 最小费用最大流 spfa() + ek()
zcube
博客等级 码龄17年 170粉丝 120原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值