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万+

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

_Modest_的博客 1万+

搜索与图论 - spfa 算法

spfa 算法

每天进步一点点! 6257

【Java】对接微信转账到零钱接口 Java微信商家转账 apiV3(该踩的雷都踩了)

配置apiv3依赖java代码。

Moonhwa的博客 4317

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. 可定位错误 以下错误

jessica0307的博客 8万+

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

泰森多面体Voronoi 3D-V5.0 功能介绍

Abaqus Voronoi3D

qq_34840441的博客 3364

【智能算法】SPFA算法

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

大雨淅淅的博客 2538

JHU ICBM DTI Atlas纤维束模板介绍

JHU ICBM DTI atlas 纤维束的定位与功能介绍

machinelearning_er的博客 6424

lidar360 V8.0 & lidar360MLS V8.0雷达点云数据处理软件

机载林业 — 基于机载激光雷达点云数据提取一系列森林结构参数(如:高度分位数、叶面积指数、郁闭度等),分割单木并提取单木参数(包括树的位置、树高、胸径、枝下高、冠幅等属性),利用软件的多种回归分析功能可以结合地面调查数据反演森林生物量、蓄积量等功能参数。还可以生成等高线、山体阴影、坡度、坡向、粗糙度等多种产品。分类 — LiDAR360提供多种分类功能,包括地面点分类、模型关键点分类、选择区域地面点分类、机器学习模型分类(可高效地分离建筑、植被、路灯等通用类别)、深度学习模型分类、自定义深度学习分类等。

2403_83796253的博客 5151

SPFA算法详解

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

qq_14886903的博客 6298

基于 Mask R-CNN 的实例分割:从零开始构建一个强大的分割模型

在本文中,我们将介绍如何使用 Mask R-CNN(Region-based Convolutional Networks with Masks)实现实例分割。实例分割是计算机视觉中的一种任务,旨在识别并分割图像中的各个对象。我们将讨论如何准备数据集、配置 Mask R-CNN 模型并在自定义数据集上进行训练。

斌擎科技 1243

SPFA算法

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

孙荣达的博客 2万+

水文仿真软件:HEC-RAS (Hydrologic Engineering Center‘s River Analysis System)_(7).一维非稳态水力模型

自定义脚本是通过编程语言(如 Python)编写的一系列自动化任务,可以帮助用户更高效地处理数据和运行模型。编写脚本:使用 Python 或其他编程语言编写自定义脚本。集成脚本:将脚本集成到 HEC-RAS 中,实现自动化数据处理和模型运行。

kkchenjj的博客 931

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

spfa算法

spfa算法简介 spfa算法是shortest path fastest algorithm的缩写。再通常情况下,是一种比较高效的求解最短路的算法。spfa的本质是广度优先搜索,将图所有的边都遍历一遍。时间复杂度是O(m),其中m是图的边数。 spfa算法的用途 spfa算法用来解决单源最短路问题,可以求解从某个点开始,到图中其他所有点的最短距离。 spfa算法的实现步骤 实现spfa算法需要一个队列q,一个标记数组vis[N]用来标记某点是否已经被搜索过。数组dist[N],用来存储起点到..

qq_41729237的博客 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Dijkstra算法与SPFA算法

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

语阑的博客 1679

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

图论算法——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、付费专栏及课程。

余额充值