单源最短路径之SPFA算法实现

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

这里来简单介绍下SPFA算法。

1、SPFA算法是求解单源最短路径的,时间复杂度为0(kn),一般k<2。所以该算法高效。

2、以下的代码借助STL中的vector,用临界表来存储图的。

3、如果要输出一条最短路径对应的路线,我们可以用source[]表来记录。例如source[a]=b,

表示a的前驱为b。这样在执行完SPFA算法后,就会得到一张source表。然后从end向前一直,

找到start为止。就可产生一条路径了。当然,以上所说的只是比较简单的。比如要求在有多条

路径时打印经过节点最少的、字典序顺序小的。。。

4、SPFA算法不仅可以判断有向图、无向图任意两点之间是否有路径可达,还可以给出实际值。

5、一个关于SPFA算法的PPT,内容不错,免积分下载:SPFA算法简介

 代码:

#include<iostream>
#include<vector>
#include<queue>
#include<stack> 
#include<cstring>
using namespace std;

const int maxn=1001;
const int INF=0x7fffffff;

struct edge   //边 
{
    int to;
    int cost;
}; 

vector<edge> myV[maxn];  //利用临界表存储图 
int numNode,numEdge;     //顶点数、边 
int minPath[maxn];       //最短路
int source[maxn];        //source[a]=b,说明a的前驱为b 
int start,end;           //起点、终点 
bool inQ[maxn];          //是否入队 
     
void inputItial()
{
    int i,from,to,cost;
    
    for(i=0;i<maxn;i++)  //清空再使用 
    {
        myV[i].clear();
    }
    
    for(i=0;i<numEdge;i++)   //建图 ,无向图 
    {
        scanf("%d%d%d",&from,&to,&cost); 

        edge e;
        e.cost=cost;
        
        e.to=to;
        myV[from].push_back(e);
        
        e.to=from;
        myV[to].push_back(e);          
    }
}


void output(int start,int end)   //输出 
{
    if(minPath[end]==INF)
    {
        printf("No Such Path Exist!\n\n");
    } 
    else if(start==end)
    {
        printf("From %d to %d :\n",start,end);
        printf("Path: %d\n",start);
        printf("Total cost : 0\n\n");
    }
    else
    { 
        printf("From %d to %d :\n",start,end);  
        printf("Path: %d",start);
        
        int tmp=end; 
        stack<int> s;
        s.push(tmp); 
        while(source[tmp]!=start)
        {   
            tmp=source[tmp];
            s.push(tmp);    
        }
        while(!s.empty())
        {
            printf("-->%d",s.top());
            s.pop();
        } 
        printf("\n");
        
        printf("Total cost : %d\n\n",minPath[end]);
    } 
}          
     
void SPFA(int start,int end)   //最短路径快速算法 Shortest Path Faster Algorithm
{
    memset(inQ,false,sizeof(inQ));
    inQ[start]=true;
    for(int j=0;j<maxn;j++) minPath[j]=INF;
    minPath[start]=0;
        
    queue<int> myQ;
    myQ.push(start);
   
    int now,to,cost;
    while(!myQ.empty())
    {
        now=myQ.front();
        myQ.pop();
            
        for(int k=0;k<myV[now].size();k++)
        {
            to=myV[now][k].to;
            cost=myV[now][k].cost+minPath[now];
             
            if(minPath[to]>cost)
            {
                source[to]=now;    //记录下to的来源为now 
                     
                minPath[to]=cost;
                     
                if(!inQ[to])
                {
                    inQ[to]=true;
                    myQ.push(to);
                }
            }
        }
            
        inQ[now]=false;
    }
    
    output(start,end);      
}
         
int main()
{
    while(scanf("%d%d",&numNode,&numEdge)==2,numNode || numEdge)
    {
        inputItial();
        
        while(scanf("%d%d",&start,&end)==2,start!=-1 && end!=-1)
        {
            SPFA(start,end);
        }
    }
 
    system("pause");   
    return 0;
}


简单的小测试:

java实现SPFA算法 1 问题描述 何为spfa(Shortest Path Faster Algorithm)算法? spfa算法功能:给定一个加权连通图,选取一个顶点,称为起点,求取起点到其它所有顶点之间的最短距离,其显著特点是可以求含负权图的单源最短路径,且效率较高。(PS:引用自百度百科:spfa是求单源最短路径的一种算法,它还有一个重要的功能是判负环(在差分约束系统中会得以体现),在Bellman-ford算... 阅读详情

相关推荐

SPFA算法.ppt

基本思想 用一个队列来进行维护。初始时将源加入队列。每次从队列中取出一个元素,并对所有与他相邻的点进行松弛,若某个相邻的点松弛成功,则将其入队。直到队列为空时算法结束; 利用了每个点不会更新次数太多的特点发明的此算法 ; 原理是著名的定理: “三角形两边之和大于第三边” 在信息学中我们叫它三角不等式。 所谓对i,j进行松弛,就是判定是否d[j]>d[i]+w[i,j],如果该式成立则将d[j]减小到d[i]+w[i,j],否则不动。 d[i]:起点s到i的临时最短路长度 松驰的结果是使j的d值减小

spfa最短路径算法模板(C++版带注释)

SPFA算法介绍以及C++模板代码,含数组构造邻接表(链式前向星法)、构造图

不负AC不负卿的博客 3469

SPFA单源最短路径算法讲解及实现

SPFA的讲解、有一个简单的例子模拟了算法执行的整个过程、 代码实现及打印最淡路径

浅谈单源最短路径(Spfa,Dijkstra)

Spfa Spfa是类似bfs的一种图论方法,运用队列更新dis[i],求得图中1~n的最短路径。 Spfa中用到dis[i]表示图中每一点距离起点的长度,bz[i]用来记录编号为i的点是否入队,a[x,y]表示图中x~y之间的距离,b[x,i]表示编号为x的点的第i条边的终点,每次更新这个终点到起点的距离,以当前入队的点来更新,最后求出答案。 tov[i]表示编号为i的边的终...

cdy1206473601的博客 527

C++ 带权有向图 最短路径及长度

C++程序,它能根据读入的带权有向图G的数据,构造并输出图G的顶点Vi到其它每个顶点的最短路径及长度,最后输出图G的拓扑序列。图的输入形式为n i i0 j0 w0 i1 j1 w1 i2 j2 w2 ...im jm wm -1 -1 -1(-1 -1 -1为输入结束标记)。它们都是整数,n是图的顶点个数且30>n>0;i是顶点Vi的编号;ik jk wk表示两个顶点编号分别为ik、jk权为wk的一条边(顶点名字依次是V0,V1,V2,…Vn-1)。(输入时,两个相邻的整数用空格隔开)。

KEIL MDK实战:如何用fromelf工具解析STM32的ELF文件结构(附完整命令行)

本文详细介绍了如何使用KEIL MDK中的fromelf工具解析STM32的ELF文件结构,包括内存段分析、符号表追踪和反汇编关键函数等实战技巧。通过完整的命令行示例,帮助嵌入式开发者优化内存占用、排查运行时问题,并提升STM32项目的开发效率。

weixin_42631411的博客 188

SPFA算法---单源最短路径问题

SPFA算法(Shortest Path Faster Algorithm)是一种解决单源最短路径问题的算法,用邻接表或邻接矩阵来存储图,主要用于处理带有负权边的图。其基本思路是通过动态逼近法对图进行松弛操作,不断更新结点的最短路径估计值,直至收敛到最优解。

m0_51547272的博客 1931

anaconda的conda国内加速镜像源(pytorch 快速安装)

最近清华源不太好使了,所以推荐中科大镜像源,如下 1.还原原始通道 conda config --remove-key channels 2.

qq_41719643的博客 2万+

单源最短路径和多源最短路径的四种算法及使用场景(Floyed + Dijkstra + Bellman-Ford + SPFA)---附Python实现实例

文章介绍Floyed + Dijkstra + Bellman-Ford + SPFA的使用场景,以及给出使用python实现的代码

qq_68630418的博客 1256

【NTN 卫星通信】使用地面网络和卫星网络接入的终端应用场景

卫星接入有广覆盖的特点, 可以改善地面接入网覆盖或无线条件差的地区(例如多径干扰)的服务可用性。对于高速移动中需要实时业务的终端,如IMS语音/视频会议,可以通过地面接入和卫星接入同时实现与5G系统的双连接,在地面接入网不可用的情况下获得连续可靠的业务。

weixin_43603524的博客 2559

超越PSPNet:PPM模块在医疗影像分割中的创新应用实验

本文探讨了PPM模块在医疗影像分割中的创新应用,通过定制化调整和优化策略显著提升分割精度。针对医疗影像的多尺度病灶特点,提出了动态尺度选择和交叉尺度融合模块(CSFM),结合PyTorch实现细节,使小病灶检测召回率提升11.3%。实验显示优化后的模型mIoU达到78.6%,较基线提升9.2个百分点,同时满足实时处理需求。

u9v0w的博客 219

单源最短路径算法之——SPFA算法

1、基本原理。关于最短路径的SPFA快速算法_段凡丁2、实现。//假定图中最大顶点个数为5 #define MAX_VERTEX 5 //采用二维数组来表示图 //两个顶点间的距离为1000 ,代表两顶点间无之间相连的边 int graph[MAX_VERTEX][MAX_VERTEX]= { {0,1,2,1000,4}, {1,0,1000,8,2}, {2,1000,...

Martian的博客 714

微信支付接口「系统繁忙 SYSTEM_ERROR」/「文件不存在」报错分析与解决方案 接口开发实现SDK

微信支付的“平台证书模式”只有5年的有效期,过期后微信支付将不再签发新的平台证书,转而要求开发者使用“微信支付公钥”来处理敏感信息加密及回调签名验证。然而,由于以下几点原因,许多开发者在调用 获取平台证书。尽管微信支付在技术迭代上有其必要性,但报错设计过于不友好。诸如“系统繁忙”这样的提示很难直接关联到平台证书失效或公钥切换问题。这样的信息表达,开发者不仅看不懂,还需要花费大量时间分析排查,非常影响效率。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 789

【原】单源最短路径快速算法(spfa)的python3.x实现

单源最短路径快速算法(spfa)的python3.x实现 0. 写在最前面 最近比较忙呢,写的比较少了。抽空写了一下这篇文档,简陋勿喷~(后面准备做个算法包,包括基础的数据结构和算法,感觉任重而道远) 1. SPFA的简介[1] SPFA(Shortest Path Faster Algorithm)算法是求单源最短路径的一种算法,它是Bellman-ford的队列优化,它是一种十...

A.Star的博客 2959

十一、Cadence ic 617以及assura使用总结

1.617的端口和514不同,没有网络属性,使用时不能直接放在原理图上,如果要直接放在图上要接线并且放上标签。2.617的端口也不能直接放在线上,514中将端口直接放在线上是可以使端口和线连接,但617看似连接,但拉出来线没有交点,实际上没有连接。这里set switches里的选项表示不同的模块,也就是选择一个就只对这一部分进行DRC验证,要验证整个版图的DRC就要把所有的选项选中,然后一个个改正。LVS中也是一样,要全部选中改正。

0 2295

Orin 调试GMSL camera 96712手册重点

96712基础理解

乐于分享 9203

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

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

lidafoye的博客 673

配置 SAP ABAP Secure Storage

系统在进行数据加密时,会将数据与当前 Key ID 进行关联,也就是说,如果此时使用的是 Key ID 4713,则该条数据会在 Encrypt.Data 字段存储一个由密钥 4713 加密后的密文。Key ID 代表了不同的密钥标识,Current Key 表示系统当前正在使用的主密钥,Value 则是对应密钥的存储值,Management Data 通常包括一些管理性或辅助性的信息,用于描述密钥的状态、过期时间或者其他属性。对于每一条被加密的业务数据,系统会记录它使用了哪一条 Key ID。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 566

spfa算法

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

qq_41729237的博客 1万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

SPFA 算法:实现原理及其应用

SPFA算法,全称为Shortest Path Faster Algorithm,是求解单源最短路径问题的一种常用算法,它可以处理有向图或者无向图,边权可以是正数、负数,但是不能有负环。

MissingPastDay的博客 3253

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

单源最短路径的SPFA算法

SPFA算法用于求单源最短路径,是Bellman-Ford算法的队列优化。尽管有人指出该算法O(E)的复杂度的理论证明是错误的,且在特别针对的图上,SPFA算法非常慢。而Dijkstra算法的理论证明严谨,表现也十分稳定。但是Dijkstra算法不能用于负权值的图,而Bellman-Ford算法效率又十分的低。所以仍然有很多人倾向于使用SPFA算法(SPFA实现比较简单,有人认为比Dijk...

RBS的专栏 1087

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

P3371 【模板】单源最短路径(弱化版)( spfa )

题目链接:点击进入 题目 思路 spfa 代码 // Problem: P3371 【模板】单源最短路径(弱化版) // Contest: Luogu // URL: https://www.luogu.com.cn/problem/P3371 // Memory Limit: 125 MB // Time Limit: 1000 ms // // Powered by CP Editor (https://cpeditor.org) //#pragma GCC optimize(3)//O3 //

Cosmic_Tree的博客 253

单源最短路径【SPFA】

单源最短路径(弱化版) 洛谷 3371Description--Input--Output--Sample Input--Sample Output--代码-- Description– 给出一个有向图,请输出从某一点出发到所有点的最短路径长度。 Input– 第一行包含三个整数N、M、S,分别表示点的个数、有向边的个数、出发点的编号。 接下来M行每行包含三个整数Fi、Gi、Wi,分别表示第i条...

ヽ(o_ _)o 283
上一篇: 27/7/2012 ICPC培训 第十二天
下一篇: 29/7/2012 ICPC培训 第十四天
lulipeng_cpp
博客等级 码龄15年 169粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值