《算法》C++代码 SPFA

SPFA的全称是Shortest Path Faster Algorithm,一看名称八成就是中国人起的名字,因为外国人起算法名称一般都会写上自己的名字,很少谦虚。实际上,这是西南交通大学段凡丁同学于1994年发表的,是针对Bellman-Ford算法的改进。在此不过多介绍背景,直接介绍SPFA算法。

  这个是单源最短路算法,效率很高,和Dijkstra二分天下。时间复杂度的分析,暂时我还没做,先摘抄2009年OI国家集训队广东中山纪念中学的姜碧野学长一篇论文中的分析:

  在一般情况,SPFA的效率很高,可以证明SPFA的期望复杂度为O(KM),K<2。但由于证明还不够严谨且适用性不广(存在针对性数据),在此不再赘述。但将会在随后的测试中用实际数据来验证SPFA的高效性。

  注:上文中所说M表示图中的边数。

  其实算法思想很简单。假设起点叫S,终点叫T。用(u,v)表示边u->v的长度。依旧用d[i]表示S->i的最短路径。我们采用“松弛操作”,不断更新可以更新的d,最终无法更新终止。算法如下:

 1 d ← ∞,队列Q初始化为空
 2 d[S]=0,Q.in(S)
 3 while(!Q.empty())
 4 {
 5     u=Q.out();
 6     for(所有的边u->v)
 7         if(d[v]>d[u]+(u,v))
 8         {
 9             d[v]=d[u]+(u,v);
10             if(v不在队内) Q.in(v);
11         }
12 }

  算法伪代码至此完毕,SPFA就是如此简洁。实际代码不予赘述。

  在此多说一句,假设图中有N个点,而在SPFA过程中发现有一个点入过队N次,并且还要入队第N+1次,那么就说明图中有负环。

  暂时就写到这里吧,有时间再补充。

时间: 2024-10-09 10:52:00

《算法》C++代码 SPFA的相关文章

算法笔记_071:SPFA算法简单介绍(Java)

目录 1 问题描述 2 解决方案 2.1 具体编码   1 问题描述 何为spfa(Shortest Path Faster Algorithm)算法? spfa算法功能:给定一个加权连通图,选取一个顶点,称为起点,求取起点到其它所有顶点之间的最短距离,其显著特点是可以求含负权图的单源最短路径,且效率较高.(PS:引用自百度百科:spfa是求单源最短路径的一种算法,它还有一个重要的功能是判负环(在差分约束系统中会得以体现),在Bellman-ford算法的基础上加上一个队列优化,减少了冗余的松弛

Python实现各种排序算法的代码示例总结

Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示例总结,其实Python是非常好的算法入门学习时的配套高级语言,需要的朋友可以参考下 在Python实践中,我们往往遇到排序问题,比如在对搜索结果打分的排序(没有排序就没有Google等搜索引擎的存在),当然,这样的例子数不胜数.<数据结构>也会花大量篇幅讲解排序.之前一段时间,由于需要,我复习了

排序算法总结---代码+性能

// data_sort_alg.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "sort_alg.h" #include <iostream> #include <vector> void show(std::vector<int> &a) { std::vector<int>::iterator it=a.begin(); while(it!=a.

机器学习算法的代码实现之第四章节:回归之梯度上升法

二种类别的点在平面上分布,我想找到一条直线,将平面划为两半边,每一边的点类别尽可能的统一,如何找到效果最佳的分界线,这就是最佳拟合问题,也叫作回归问题. 这次,代码很少.logRegres.py # coding:utf-8 from numpy import * #=============================================================================== # 数据集 #=============================

计算机视觉算法与代码集锦

计算机视觉算法与代码集锦 计算机视觉是结合了传统摄影测量,现代计算机信息技术.人工智能等多学科的一个大学科,是一片开垦不足的大陆,路很远,但很多人都在跋涉! 本文转自CSDN(地址http://blog.csdn.net/whucv/article/details/7907391),是一篇很好的算法与代码总结文档,转载在此供大家学习参考. 原文如下: UIUC的Jia-Bin Huang同学收集了很多计算机视觉方面的代码,链接如下: https://netfiles.uiuc.edu/jbhua

谱聚类算法及其代码(Spectral Clustering)

简介 文章将介绍谱聚类(spectral clustering)的基本算法,以及在matlab下的代码实现.介绍内容将包括: 从图分割角度直观理解谱聚类 谱聚类算法步骤 数据以及实现代码 本文将不会涉及细节化的证明和推导,如有兴趣可参考july大神的文章从拉普拉斯矩阵说到谱聚类. 对谱聚类的理解 这一节将从图分割聚类的角度直观理解谱聚类.不过,因为本人是从事社交媒体分析的,将从一种社会关系网络的角度来介绍网络图分割成多个子图的概念. 图的分割 首先将社会关系网络看成是一个整体,每一个个体(use

php短网址算法实例代码分享

php实现的短网址算法,理论上支持1,073,741,824个短网址. 每个网址用6个字符代替,(6^32) 最多可以拥有1,073,741,824个短网址.当然,你还可以记录更详细的信息,如访问记录,创建时间等.如果真不够用了,还可以删掉很久不用的. function shorturl($input) { $base32 = array ( 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p

kmp算法c++代码实现

1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 #define max 5000 5 6 int t[max];//目标串 7 int p[max];//模式串 8 int next[max];//前缀函数 9 int n,m;//n为目标串的数目,m为模式串的数目 10 void function_prefix(int *s,int *next) 11 { 12 next[1]=next[0]=0;

各种排序算法的代码

1 // ALLKindsOfSorts.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h" 5 #include<iostream> 6 #include<vector> 7 #include<bitset> 8 9 using namespace std; 10 11 ////////////////////////////////////////所有的排序总结///////////////////

KMP算法的代码实现

上周算法班的BEN老师花了1个小时讲自动机和KMP的关系,结果failed...明天又要上课了,花了半天时间看了下KMP,暂且停留在利用next求模式中的跳跃长度,自动机那个还不能理解... 具体的可以百度阮一峰的KMP算法. 看着什么前缀后缀,突然想到上下文无关文法乔姆斯基范式了....又想到了NFA和正则表达式的转换,是时候复习复习了.. 太晚了,直接上代码,明天继续看ML和统计学!加油! 1 #include <iostream> 2 #include <string> 3