SPFA算法是对Bellman-Ford算法的改进,使用了队列进行了优化,在时间复杂度上,一般情况下是优于Dijkstra算法的。在SPFA算法中每次仅对最短路径估计值发生改变了的顶点的所有出边执行松弛操作。并使用队列来维护这些发生了变化的点。每次选取队首顶点u的所有边进行松弛操作,假设有一条u到v的边,如果通过这条边使得源点到顶点v的最短路程变短,且顶点v不在当前队列中,就将顶点v放入队尾。

算法过程

queue<int> q;
源点s入队;
while(队列非空){取出队首元素;for(u的所有邻接边u->v){if(d[u]+dis<d[v]){d[v]=d[u]+dis;if(v当前不在队列){v入队;if(v入队次数大于n-1){说明有可达负环,return;}}}}
}

算法实现

adjacencyList.py
class Vertex:def __init__(self,key):self.id = keyself.connectedTo = {}# 从这个顶点添加一个连接到另一个def add_neighbor(self, nbr, weight=0):self.connectedTo[nbr] = weightdef __str__(self):return str(self.id) + ' connectedTo ' + str([x for x in self.connectedTo])# 返回邻接表中的所有的项点def get_connections(self):return self.connectedTo.keys()def get_id(self):return self.id# 返回从这个顶点到作为参数顶点的边的权重def get_weight(self, nbr):return self.connectedTo[nbr]class Graph:def __init__(self, num=None):self.vertList = {}self.numVertices = 0if num is not None:[self.add_vertex(i+1) for i in range(num)]def add_vertex(self, key):self.numVertices += 1v = Vertex(key)self.vertList[key] = vreturn vdef get_vertex(self, n):if n in self.vertList:return self.vertList[n]else:return Nonedef __contains__(self, item):return item in self.vertListdef add_edge(self, u, v, w = float('inf')):if u not in self.vertList:self.add_vertex(u)if v not in self.vertList:self.add_vertex(v)self.vertList[u].add_neighbor(self.vertList[v].get_id(), w)def get_vertices(self):return self.vertList.keys()def __iter__(self):return iter(self.vertList.values())

spfa.py

import queue
from adjacencyList import Graphdef spfa(graph, src):if graph is None:return Nonedis = [float('inf') if i != src else 0 for i in range(graph.numVertices + 1)]# 表示结点i是否在队列中book = [False for i in range(graph.numVertices + 1)]que = queue.Queue()que.put(graph.get_vertex(src))while not que.empty():u = que.get()u_id = u.get_id()con = [nei for nei in u.get_connections()]for c in con:if dis[c] > dis[u_id] + u.get_weight(c):dis[c] = dis[u_id] + u.get_weight(c)if not book[c]:# 如果当前访问结点没有在队列中,就入队que.put(graph.get_vertex(c))book[c] = True# 出队book[u_id] = Falsereturn dis[1:]if __name__ == '__main__':graph = Graph(5)graph.add_edge(1, 2, 2)graph.add_edge(1, 5, 10)graph.add_edge(2, 3, 3)graph.add_edge(2, 5, 7)graph.add_edge(3, 4, 4)graph.add_edge(4, 5, 5)graph.add_edge(5, 3, 6)print(spfa(graph, 1))

运行结果

参考:邻接表的python实现 - youngliu91 - 博客园

spfa算法的python实现相关推荐

  1. poj 3662 Telephone Lines spfa算法灵活运用

    意甲冠军: 到n节点无向图,它要求从一个线1至n路径.你可以让他们在k无条,的最大值.如今要求花费的最小值. 思路: 这道题能够首先想到二分枚举路径上的最大值,我认为用spfa更简洁一些.spfa的本 ...

  2. 图论-最短路径--3、SPFA算法O(kE)

    SPFA算法O(kE) 主要思想是:     初始时将起点加入队列.每次从队列中取出一个元素,并对所有与它相邻的点进行修改,若某个相邻的点修改成功,则将其入队.直到队列为空时算法结束.     这个算 ...

  3. HDU3440(差分约束+SPFA算法)

    题意:两栋房子之间的最大距离为D,也就是A-B<=D,现在求出最矮和最高房子之间的最大距离 思路:差分约束+SPFA算法: 当问题可以转化为形如一组 xi‑x'i<=yi 或一组 xi‑x ...

  4. poj2387(SPFA算法)

    1.建⽴⼀个队列,初始时队列⾥只有起始点,再建⽴⼀个表格记录起始点到所有点的最短路径(该表格的初始值要赋为极⼤值,该点到他本⾝的路径赋为 无穷大).然后执⾏松弛操作,⽤队列⾥有的点作为起始点去刷新到所 ...

  5. 图论刷水题记录(二)(最短路-----SPFA算法)

    继第一篇的后续,又来刷水题了,写的是SPFA算法,这个算法的复杂度比较玄学,感觉能不用就不用了,但是他的好处就是可以判断负圈. 3月26日: 1.POJ 1847 Tram 题意:在一个交通网络上有N ...

  6. 基于朴素贝叶斯的垃圾分类算法(Python实现)

    有代码和数据集的 https://blog.csdn.net/weixin_33734785/article/details/91428991 附有git库代码的 https://www.cnblog ...

  7. 手把手教你在多种无监督聚类算法实现Python(附代码)

    来源: 机器之心 本文约2704字,建议阅读6分钟. 本文简要介绍了多种无监督学习算法的 Python 实现,包括 K 均值聚类.层次聚类.t-SNE 聚类.DBSCAN 聚类. 无监督学习是一类用于 ...

  8. SPFA算法O(kE)

    SPFA算法O(kE) Dijkstra和Floyed是不断的试点.Dijkstra试最优点,Floyed试所有点. Bellman-Ford和SPFA是不断的试边.Bellman-Ford是盲目的试 ...

  9. 八大排序算法的 Python 实现

    八大排序算法的 Python 实现 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入 ...

  10. (最短路径算法整理)dijkstra、floyd、bellman-ford、spfa算法

    一.floyd 1.介绍 floyd算法只有五行代码,代码简单,三个for循环就可以解决问题,所以它的时间复杂度为O(n^3),可以求多源最短路问题. 2.思想: Floyd算法的基本思想如下:从任意 ...

最新文章

  1. 用Windows系统实现RAID功能
  2. HDOJ_ACM_折线分割平面
  3. 网络推广专员浅析网络推广期间网站收录如何提升?
  4. Java知识点总结(Java容器-EnumSet)
  5. 【课件】基础雷达信号处理
  6. response的运行过程
  7. iQOO Neo6入网:骁龙8旗舰平台+80W快充
  8. 加盟商最大的顾虑是什么?
  9. 帆软报表(多sheet)自定义分页查询
  10. 利用DEEPLABV3-RESNET101获取人体蒙版
  11. 映美Jolimark G102 打印机驱动
  12. 微型计算机三部分基本组成,微型计算机的基本组成-电脑自学网
  13. allegro铜皮倒圆角
  14. wps下一页 很好玩!wps中怎么插入欧姆符号
  15. 【jiasuba】让Win7系统下的硬盘不在狂闪的诀窍
  16. get请求报404 NOT FOUND问题的原因及解决。
  17. [转载]NFC功能介绍
  18. 【ROOT from CERN】——TSpectrum2类与二维寻峰
  19. A股上市公司名义所得税率(2003-2019)
  20. 最壕年会!微信送每人一台高配定制版 iPhone X

热门文章

  1. 瑞萨RH850F1x单片机开发板完整开发环境搭建介绍
  2. 金万维异速联远程接入解决方案
  3. mysql数据库导入语句_mysql导入命令 mysql导入数据库语句
  4. Android Stdio4.1.1版本使用问题
  5. [java]房屋出租系统
  6. 手机三十分钟熄屏如何一直亮_怎么让手机屏幕一直亮着
  7. html实现点击直接下载文件-前端教程
  8. php redis菜鸟教程,PHP 使用 Redis
  9. mt2503短信數量和定義的不一致
  10. 【Android】SDK环境变量配置