SPFA最短路算法

SPFA最短路算法前言算法用途算法原理算法结果算法实现正确性证明例题 CPP 源代码前言咳 又是一个新的博客 最近几天高产似母猪哈今天要讲的是 SPFA 算法 欢迎大家来看 算法用途这个算法 如其名 ShortestPath 就是求最短路的算法 和 Dijkstra 一样 这是一个单源最短路算法 算法原理这个算法因为与贝尔曼福德 Bellman Ford 算法比较相似

算法用途

这个算法,如其名:Shortest Path Fastest Algorithm,就是求最短路的算法。和 Dijkstra 一样,这是一个单源最短路算法。

算法原理

这个算法因为与贝尔曼福德(Bellman-Ford)算法比较相似,只是在它的算法的基础上进行了队列优化,因此也被嘲讽为“队列优化的贝尔曼福德”。

就是每次可以更新到一个节点的最短距离的时候,我们就更新它,并更新所有它能到达的子节点,直到没有节点需要被更新。

算法结果

算法运行结束后,将会得到一个处理好的数组 d d d,其中 d [ i ] d[i] d[i]代表从起点出发到节点 i i i的最短路长度。

算法实现

  • 我们首先定义一个数组 d d d,代表我们选定的起点到其他各个点的距离最小值,将 d d d数组中除了起点以外的所有的元素都赋成INF(无限大);
  • 然后我们定义一个队列(先进先出),并将起点压入队列中,记录起点已经在队列中;
  • 循环:取出一个节点(设为 u u u),枚举与之相连的节点(设为 v v v,并设 线 段 u v 的 长 度 为 w 线段uv的长度为w 线uvw),如果:
    • 发现 d [ u ] + w < d [ v ] d[u]+w
      d[u]+w<d[v]
      ,那么就更新 d [ v ] = d [ u ] + w d[v]=d[u]+w d[v]=d[u]+w,并且如果 v v v不在队列中,就将其加入队列,并记录 v v v点已经在队列中。
    • 如果不满足 d [ u ] + w < d [ v ] d[u]+w
      d[u]+w<d[v]
      ,那么就什么也不做,继续取下一个 v v v

请看图(啊啊啊啊啊这个破图我做了两天!!!要转载请注明出处!!!)。

SPFA GIF演示

例题

洛谷P3371 【模板】单源最短路径

P3371 【模板】单源最短路径

题目描述

如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。

输入输出格式

输入格式:
输出格式:

一行,包含N个用空格分隔的整数,其中第i个整数表示从点S出发到点i的最短路径长度(若S=i则最短路径长度为0,若从点S无法到达点i,则最短路径长度为)

输入输出样例

输入样例#1:
输出样例#1:

0 2 4 3

说明

时空限制:

1000ms,128M

数据规模:
样例说明:

样例解释

这个题就是模板题,直接打好 SPFA 就行了。

CPP源代码

#include 
     #include 
     using namespace std; int n,m,s; #define MM  #define MN 10005 #define INF  #define IINF  struct node{ 
   int u,v,w,next;}; node edge[MM]; int head[MN]; int spfa[MN]; queue<int>q; bool inq[MN]; void SPFA() { 
    q.push(s); inq[s]=true; for(int i=1;i<=n;i++) spfa[i]=INF; spfa[s]=0; while(!q.empty()) { 
    int u=q.front();q.pop(); inq[u]=false; for(int i=head[u];i>0;i=edge[i].next) { 
    int v=edge[i].v; int w=edge[i].w; if(spfa[v]>spfa[u]+w) { 
    spfa[v]=spfa[u]+w; if(!inq[v]) { 
    inq[v]=true; q.push(v); } } } } } int main() { 
    cin>>n>>m>>s; for(int i=1;i<=m;i++) { 
    int u,v,w; cin>>u>>v>>w; edge[i]=(node){ 
   u,v,w,head[u]}; head[u]=i; } SPFA(); for(int i=1;i<=n;i++) { 
    if(spfa[i]==INF) spfa[i]=IINF; cout<<spfa[i]<<" "; } return 0; } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/211541.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午10:11
下一篇 2026年3月18日 下午10:12


相关推荐

  • 如何配置maven本地仓库_maven指定本地仓库

    如何配置maven本地仓库_maven指定本地仓库1)配置本地仓库1)Maven的核心程序并不包含具体功能,仅负责宏观调度。具体功能由插件来完成。Maven核心程序会到本地仓库中查找插件。如果本地仓库中没有就会从远程中央仓库下载。此时如果不能上网则无法执行Maven的具体功能。为了解决这个问题,我们可以将Maven的本地仓库指向一个在联网情况下下载好的目录。2)Maven默认的本地仓库:~.m2\repository目录。Tips:~表示当前用户的家目录。3)Maven的核心配置文件位置:解压目录E:\apache-maven.

    2025年11月19日
    3
  • 推荐系统中的常用算法——Wide & Deep

    推荐系统中的常用算法——Wide & Deep这篇文章是阅读《Wide&amp;DeepLearningforRecommenderSystems》后的总结,该文章中提出结合Wide模型和Deep模型的组合方法,对于提升推荐系统(RecommendationSystem)的性能有很重要的作用。1、背景本文提出Wide&amp;Deep模型,旨在使得训练得到的模型能够同时获得记忆(memorization)…

    2022年5月23日
    42
  • 机器学习框架对比

    机器学习框架对比2.1主流深度学习框架对比各个开源框架在Github上的数据统计数据统计截止于2017.07.15可以看到各大主流框架基本都支持Python,目前Python在科学计算和数据挖掘领域可以说是独领风骚。虽然有来自R、Julia等语言的竞争压力,但是Python的各种库实在是太完善了,Web开发、数据可视化、数据预处理、数据库连接,爬虫等无所不能,有一个完美的生态环境。仅

    2022年6月16日
    32
  • S3C2440 LED驱动总结

    S3C2440 LED驱动总结1.电路图2.使用说明此驱动实现二种操作模式: 普通操作模式:./LedTest<led1/led2/led3><on/off> 点亮或熄灭某个LED灯 掩码操作模式:./LedTestled_mask led_mask只能是:000、001、010、011….111 可以同时设置三个LED,对应1位置的LED被点亮,对应0位置熄灭…

    2022年5月12日
    66
  • vs实现用户注册登录_用户注册和登录的实现

    vs实现用户注册登录_用户注册和登录的实现publicstaticUserInfoGetUser(stringname,stringpwd){//填写搜索姓名和密码的sql语句stringsql=string.Format(“select*fromUserInfowhereLoginName='{0}’andPassword='{1}'”,name,pwd);DataTabledt=DBHelper.ExcuteTab.

    2022年8月22日
    12
  • 2021年7月整理–简单方法 暴力激活成功教程WIFI密码

    2021年7月整理–简单方法 暴力激活成功教程WIFI密码2021年7月整理–简单方法暴力激活成功教程WIFI密码很多人都面临过短期租房、短期出差、住院而没有WIFI可用等境遇,有的是宽带太多办不起、有的是临时一阵子不值得折腾、有的是运营商不给扯线等等原因。然后就用手机下载了WIFI智能钥匙等APP,然后发现卵用么有,根本没有人共享自家WIFI密码给你用。以下是按步骤整理的软件和详细教程笔记本电脑+软件暴力激活成功教程出的密码我亲身用这个软件解开N多个密码此软件是家用路由器安全审计工具,切勿用作非法用途!!!….

    2022年8月22日
    12

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号