Algorithm 最短路径之 SPFA

图论最短路算法——spfa算法 概述: SPFA–Shortest Path Faster Algorithm 是一种单源最短路算法,通常被认为是Bellman-ford算法的队列优化,在代码形式上接近于BFS,是一个实际中一个非常高效的算法,并且可以解决Dijkstra算法中的所不能解决的负边权,但是如果竞赛中有出题人出数据卡你的spfa,你就难受了,所以这里我建议没有负边权,不要轻易使用spfa算法,而是使用优先队列优化的D... 阅读详情
SPFA 是ford算法的优化版。 这个算法 需要用到一个静态的邻接表,还有一个队列。主要有三部分 一:Aadedge需要把边以静态邻接表的形式保存下来 。
二:inti 初始化 。在初始化的过程中 要把pre【】=== -1,dist【】=== INF。然后输入边的信息。调用Addedge(x , y ,w).。
三:SPFA 这个过程 一开始的时候将start 1 push(1)。通过(j = pre[temp] ;j !=-1 ; j=edge[j].next)将以1为边的所有边 进行遍历 。并且判断是否需要松弛。如果需要那么 将这点加入q的队列中。至到while(!q.empty() 。

下面是代码部分

<span style="font-size:18px;">#include
#include
#include
#include
#include

using namespace std ;

#define MAXN 1000
#define INF 1000000

int map[MAXN][MAXN] ;
int visit[MAXN] ;
int pre[MAXN] ;
int dist[MAXN] ;
int path[MAXN] ;
int top ;

queue q ;

struct Edge
{
    int to ;
    int w ;
    int next ;
   
}edge[MAXN*MAXN];


void addedge(int x ,int y , int w )
{
    edge[top].to = y ;
    edge[top].w = w ;
    edge[top].next = pre[x] ;
    pre[x] = top ;
    top++ ;
}

void init (int n, int m)
{
    int i , j ;
    top = 1 ;
   
    memset(pre , -1 ,sizeof(pre)) ;
    for(i = 1 ;i <= n ; i++)
        dist[i] = INF ;
    dist[1] = 0 ;
    for(i = 1 ;i <= n ; i++){
        for(j = 1 ;j <= n ; j++){
            map[i][j] = INF ;
           
        }
    }
   
    for(i = 1 ;i <= m ; i++){
        int x ,y , w ;
        scanf("%d%d%d" ,&x ,&y , &w) ;
        if(map[x][y] < w) continue ;
        addedge(x,y,w) ;
        addedge(y,x,w) ;
        map[x][y] = map[y][x] = w ;
       
    }       
}


void spfa(int n)
{
    int done[MAXN] ;
    int temp  ;
   
    memset(done , 0 , sizeof(done)) ;
   
    while(!q.empty()) q.pop() ;//第二次用的时候里面已经被上一组的数据盖着
   
   
    q.push(1) ;
    done[1] = 1 ;
    path[1] = -1 ;
   
   
    while(!q.empty()){       
        temp = q.front() ;
        q.pop() ;
        done[temp] = 0 ;
       
        int j ;
        for(j = pre[temp] ; j != -1 ; j = edge[j].next){           
            int v ,fee ;
            v = edge[j].to ;
            fee = edge[j].w ;
           
            if(dist[temp] + fee < dist[v]){           
                dist[v] = dist[temp] + fee ;

                path[v] = temp ;
                if(!done[v]){
                    q.push(v) ;
                    done[v] = 1 ;
                   
                }
            }
                       
        }
       
    }               
}


int main()
{
    int m , n ;
    int i , j ;
    int ans[MAXN] ;
    while(scanf("%d%d" ,&n, &m )!=EOF ){
        if(n == 0 && m == 0) break ;
        init(n ,m) ;
        spfa(n) ;

        printf("%d\n",dist[n]) ;

        int t = 0 ;
        for(i = n ; i != -1 ; i = path[i]){
            ans[t++] = i ;
        }
        for(i = t-1 ; i >= 0 ; i--){
            printf("%d ",ans[i]) ;
        }
        printf("\n") ;

       
    }
   
    return 0;
}</span>


SPFA最短路径 路径记录 做了一道板子题,求v0点到任意点的最短距离和最短路径这里用SPFA,记录一下#include &lt;bits/stdc++.h&gt; #define MAXN 500005 using namespace std; typedef long long ll; struct Edge{ ll next, weight; Edge(ll _next, ll _weig... 阅读详情

相关推荐

邻接表实现 单源最短路径SPFA算法 poj1511

首先讲邻接表的实现,以前一直遇到题目都是用vector模拟,今天遇到一个题目vector超时,于是学习了用数组模拟实现邻接表,新学的数据结构,搞的不是很透彻,记录一下。 其实就是头插发,首先用一个结构体E记录节点的信息,指向那个节点,以及指向节点的权值等信息,给E结构体设置一个next,让它指向H数组,H数组初始化为-1,初始化为-1是为了方便判断某个点直接相连点是否找完了,自己还不是很透彻了,

大神养成中..... 7330

最短路算法之spfa (入门,玄学的时间复杂度)

最近做了很多图论题,最短路,MST,二分图,网络流等等。 感觉目前自己可以理解通透的只有最短路和MST。今天写一下关于spfa自己的理解 spfa是单源最短路算法。 第一步,我们需要存图,通常会开一些二维的数组,不得不说二维数组确实使用方便。但是他的局限性就是太耗费内存。开了很多无用的。而且二维开10000就会爆掉内存,于是我们用了两组方式存图。 1.vector不定长数组存图,开一个一...

Evildoer_llc的博客 7950

SPFA最短路径算法详解

spfa算法最短路径,算法思路,算法实现

m0_54615144的博客 715

SPFA算法

SPFA算法

2588

Pytorch.nn.Linear 解析(数学角度)

pytorch.nn.Linear 是一个类,下面是它的一些初始化参数 in_features : 输入样本的张量大小 out_features : 输出样本的张量大小 bias : 偏置 它主要是对输入数据做一个线性变换。 y=xAT+b y=xA^T+b y=xAT+b 这里A是权重矩阵,b是偏置。他们都是根据 in_features 生成 测试代码: m = torch.nn.Linea...

Medlen 1万+

从防御者视角复盘:用WinArpAttacker和Wireshark在Windows上模拟并检测ARP欺骗攻击

本文详细解析了Windows平台下的ARP欺骗攻击与防御策略,通过WinArpAttacker和Wireshark工具模拟攻击并检测异常流量。文章涵盖实验环境搭建、攻击原理深度解析、流量特征分析及企业级防御方案,帮助安全运维人员全面掌握ARP攻击检测与防护技术。

weixin_30918633的博客 121

单源最短路——热浪

热浪 德克萨斯纯朴的民众们这个夏天正在遭受巨大的热浪!!! 他们的德克萨斯长角牛吃起来不错,可是它们并不是很擅长生产富含奶油的乳制品。 农夫John此时身先士卒地承担起向德克萨斯运送大量的营养冰凉的牛奶的重任,以减轻德克萨斯人忍受酷暑的痛苦。 John已经研究过可以把牛奶从威斯康星运送到德克萨斯州的路线。 这些路线包括起始点和终点一共有 T 个城镇,为了方便标号为 1 到 T。 除了起点和终点外的...

行走天涯的豆沙包的博客 549

基于分位数回归的静态CoVaR计算 案例与代码

原文链接:https://bbs.pinggu.org/thread-7925441-1-1.html 一、静态CoVaR模型介绍 二、资料简介 实现对相关期刊论文进行论文重现,解决实证分析中的技术操作问题。里面包含了每一步详细的步骤,可以方便的利用这个手册解决大部分利用分位数回归计算静态CoVaR的论文的模型实现问题。即从数据下载到模型实现一整条操作步骤。 关键词:【分位数回归】【Co...

ChenQihome9的博客 7503

最短路径问题:SPFA(Shortest Path Faster Algorithm)算法

http://www.cnblogs.com/hxsyl/p/3248391.html

睡得香吃得好胆子大的专栏 1245

C# Code-Behind 技术全面解析

Code-Behind 是 ASP.NET Web Forms 中的一种技术模式,通过将用户界面标记(.aspx文件)与程序逻辑代码(.aspx.cs文件)分离,实现表现层与逻辑层的解耦。其核心思想是前端展示与后台逻辑的物理文件分离,通过ASP.NET编译器将两者合并编译成一个Page类并执行。Code-Behind 的优势包括较好的代码组织、较高的开发效率,尤其适合快速开发数据驱动应用。然而,与现代开发模式如ASP.NET MVC、ASP.NET Core和Blazor相比,Code-Behind 在可维

记录学习的过程 956

AgentScope实战训练营- Java从零开始快速构建Agent完整教程

本文基于阿里巴巴开源的 AgentScope Java 框架,从零开始手把手带你构建 AI 智能体应用。内容涵盖环境搭建、基础对话、工具调用、结构化输出、多Agent流水线、Hook可观测性、会话持久化、MCP协议、RAG知识库集成、多模态工具、技能系统、Spring Boot Web部署等21个核心模块,附带完整可运行代码示例,帮助Java开发者快速掌握Agent开发全流程。

program哲学 859

GIS系列专题(7):使用SPFA算法(Shortest Path Faster Algorithm)解决最短路径问题

本篇非原创,转载自 SPFA求单源最短路径 - 箜瑟_qi - 博客园序 求 最短路径 的算法有很多,各有优劣。 比如Dijkstra(及其堆(STL priority_queue)优化),但是无法处理负环的情况; 比如O(n^3)的Floyd算法;比如Bellman https://www.cnblogs.com/kongse-qi/p/6902328.html 序 求最短路径的算法有很多,各有优劣。 比如Dijkstra(及其堆(STL-priority_queue)优化),但是无法处理负环的情况

$firecat利白的代码足迹$ 691

流体仿真软件:COMSOL Multiphysics二次开发_(11).COMSOL与外部软件的数据交换

通过上述方法,您可以实现 COMSOL Multiphysics 与外部软件的数据交换,从而更好地集成和分析仿真结果。无论是从文本文件导入数据,导出数据到 MATLAB,还是通过 API 和 COMSOL Server 实现实时通信,都能满足不同场景下的需求。希望这些内容对您在流体仿真领域的开发工作有所帮助。

kkchenjj的博客 1553

【最短路径算法】 -- SPFA(Shortest Path Faster Algorithm)

SPFA是优化的Bellman-Ford算法 Bellman-Ford算法每轮操作都要遍历所有的边,这其中有许多无效的操作。只有当某个顶点u的d[u]值改变时,从它出发的边的邻接点v的d[v]值才有可能被改变。 SPFA算法的伪代码 queue<int> q; 源点s入队; while(队列非空) { 取出队首元素; for(u的所有邻接边u->v) { if(...

圣托里尼的日落啊~的博客 388

实战篇| app爬虫不用真机

之前写过一篇基于真机app爬虫《App爬虫实战篇-以华为真机手机爬取集换社的app为例》,如果大家有用真机爬虫的经历,会深刻认识到真的不方便,一是自己的手机,经常会被电话、微信等打断,二是闲置手机,面对小批量数据还能勉强,大批量爬虫,会导致成本指数级上升,并且控制起来相对麻烦。以下就是常见的模拟器。emulator -avd my_avd -no-snapshot-save # 启动时不保存 snapshot。emulator -avd my_avd -wipe-data # 清除数据(恢复到出厂)

youbingchen的博客 596

VS Code下载安装与使用教程

VSCode下载安装与使用教程

weixin_46713695的博客 4万+

最短路径算法—SPFA(Shortest Path Faster Algorithm)算法分析与实现

原文地址:http://www.wutianqi.com/?p=2285 建议看SPFA前先看看Dijkstra和Bellman-Ford这两个最短路算法。 SPFA的思路比较简单,网上的说法也比较统一,NOCOW和百度百科上都有。这里在网上找到讲的比较通俗易懂的: SPFA(Shortest Path Faster Algorithm) 是Bellman-Ford算法的一种队列实现,

WUYUAN2011WOAINI的专栏 1338

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

SPFA

求单源最短路的SPFA算法的全称是:Shortest Path Faster Algorithm,是西南交通大学段凡丁于1994年发表的。 定理: 只要最短路径存在,上述SPFA算法必定能求出最小值。 数据结构: 队列q, 用数组dis记录每个结点的最短路径估计值. vis存是否在队列里 采取的方法是动态逼近法: 设立一个先进先出的队列用来保存...

dingcao9109的博客 103

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

spfa算法c语言程序,最短路径算法—SPFA(Shortest Path Faster Algorithm)算法分析与实现(C/C++)...

这篇博客是从旧博客 WordPress 迁移过来,内容可能存在转换异常。建议看SPFA前先看看Dijkstra和Bellman-Ford这两个最短路算法。SPFA的思路比较简单,网上的说法也比较统一,NOCOW和百度百科上都有。这里在网上找到讲的比较通俗易懂的:*SPFA(Shortest Path Faster Algorithm)*是Bellman-Ford算法的一种队列实现,减少了不必要的冗...

weixin_39846289的博客 360

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

最短路径算法—SPFA(Shortest Path Faster Algorithm)算法分析与实现(C/C++)

建议看SPFA前先看看Dijkstra和Bellman-Ford这两个最短路算法。SPFA的思路比较简单,网上的说法也比较统一,NOCOW和百度百科上都有。这里在网上找到讲的比较通俗易懂的:SPFA(Shortest Path Faster Algorithm) 是Bellman-Ford算法的一种队列实现,减少了不必要的冗余计算。 算法大致流程是用一个队列来进行维护。 初始时将源加入队列。 每

long-long-ago 2275

单源最短路径-spfa算法

** int n; //表示n个点,从1到n标号 int s,t; //s为源点,t为终点 int d[N]; //d[i]表示源点s到点i的最短路 int p[N]; //记录路径(或者说记录前驱) queue q; //一个队列,用STL实现,当然可有手打队列,无所谓 bool vis[N]; //vis[i]=1表示点i在队列中 vis[i]=0表示不在队列中 *

wwy1029258584的博客 356

题目1 : 最短路径·三:SPFA算法

题目1 : 最短路径·三:SPFA算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 万圣节的晚上,小Hi和小Ho在吃过晚饭之后,来到了一个巨大的鬼屋! 鬼屋中一共有N个地点,分别编号为1..N,这N个地点之间互相有一些道路连通,两个地点之间可能有多条道路连通,但是并不存在一条两端都是同一个地点的道路。 不过这个

记录走过的风风雨雨 798

基于matlab的spfa算法,关于最短路径的程序 spfa算法

不管怎么说,得到了自己的一个SPFA程序{TASK:butterLANG:PASCAL}program butter;constmaxn=800;maxq=maxn shl 1;varn,p,c:integer;map:array[1..maxn,1..maxn]of integer;dis:array[1..maxn,1..maxn] of longint;cowin:array[0..maxn...

weixin_39757265的博客 433

SPFA详解(^-^)

SPFA(Shortest Path Faster Algorithm)(队列优化)算法是求单源最短路径的一种算法,它还有一个重要的功能是判负环如果没必要判负环建议使用DijkstraSPFA判断负环:如果一个点进入队列达到n次,则表明图中存在负环,没有最短路径。主要思想及方法:...

短发 3517

SPFA-浪里个浪

Time Limit: 1500 mSec    Memory Limit : 32768 KB Problem Description TonyY是一个喜欢到处浪的男人,他的梦想是带着兰兰姐姐浪遍天朝的各个角落,不过在此之前,他需要做好规划。 现在他的手上有一份天朝地图,上面有n个城市,m条交通路径,每条交通路径都是单行道。他已经预先规划好了一些点作为旅游的起点和终点,他想选择其

xiaoxiede_wo的博客 320
上一篇: Algorithm 优先队列来处理的 最短路径
下一篇: Algorithm 并查集的 路径压缩(递归和非递归)
CallMeJiaGu
博客等级 码龄12年 149粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值