SPFA(Shortest Path Faster Algorithm)算法,是一种求最短路的算法。

SPFA的思路及写法和BFS有相同的地方,我就举一道例题(洛谷——P3371 【模板】单源最短路径(弱化版)来做讲解吧!

如题:



首先,我们先来定义一波变量吧:

struct node{
int v,w;
node (){ }
node (int _v,int _w){
v=_v;
w=_w;
}//构造函数
}; queue<int>qu;//必备队列 const int inf=0x3f3f3f3f;//最大值 vector<node> g[10010];//动态数组存点集
int inq[10010],dst[10010];//标记数组以及确认的最短路经
int n,m;

然后再来一个存图函数

void add(int u,int v,int w){
g[u].push_back(node(v,w));
}

好了,基本的变量函数已经准备好了,现在就开始我们的SPFA。

但需要传什么参数进去呢?那就简洁点,就只要一个s(松弛的点)

void spfa(){

}

首先我们来给dst赋一个最大值,因为求最短路嘛,当然要赋一个最大值嘛。

memset(dst,inf,sizeof dst);

然后就标记+dst还原成0+放进队列

int u=s;
dst[u]=0;
inq[u]=1;
qu.push(u);

下面就开始一波日常的操作:

while (!qu.empty()){
u=qu.front();
qu.pop();//弹出去,不然就出不去了(无限循环)
inq[u]=0;//取消标记,万一会重复走呢?
for (int i=0;i<g[u].size();i++){
int v=g[u][i].v;
int w=g[u][i].w;//取出来,简洁
if (dst[v]>dst[u]+w){
dst[v]=dst[u]+w;//如果松弛了更小,那就松弛吧
if (!inq[v]){
qu.push(v);
inq[v]=1;//如果没走过,那就放进qu在标记一下
}
}
}
}

main函数里就不用讲了嘛:

int main(){
int s;
cin>>n>>m>>s;
while (m--){
int u,v,w;
cin>>u>>v>>w;
add(u,v,w);
}
spfa(s);
for (int i=1;i<=n;i++){
if(dst[i]==0x3f3f3f3f){
cout<<2147483647<<" ";
}else{
cout<<dst[i]<<" ";
}
}
return 0;
}

最后,完整的代码为:

#include <bits/stdc++.h>
using namespace std;
struct node{
int v,w;
node (){ }
node (int _v,int _w){
v=_v;
w=_w;
}
}; queue<int>qu; const int inf=0x3f3f3f3f; vector<node> g[10010];
int inq[10010],dst[10010];
int n,m; void add(int u,int v,int w){
g[u].push_back(node(v,w));
} void spfa(int s){
memset(dst,inf,sizeof dst);
int u=s;
dst[u]=0;
inq[u]=1;
qu.push(u);
while (!qu.empty()){
u=qu.front();
qu.pop();
inq[u]=0;
for (int i=0;i<g[u].size();i++){
int v=g[u][i].v;
int w=g[u][i].w;
if (dst[v]>dst[u]+w){
dst[v]=dst[u]+w;
if (!inq[v]){
qu.push(v);
inq[v]=1;
}
}
}
}
} int main(){
int s;
cin>>n>>m>>s;
while (m--){
int u,v,w;
cin>>u>>v>>w;
add(u,v,w);
}
spfa(s);
for (int i=1;i<=n;i++){
if(dst[i]==0x3f3f3f3f){
cout<<2147483647<<" ";
}else{
cout<<dst[i]<<" ";
}
}
return 0;
}

完美结束

图论之最短路算法之SPFA算法的更多相关文章

  1. Bellman-ford算法、SPFA算法求解最短路模板

    Bellman-ford 算法适用于含有负权边的最短路求解,复杂度是O( VE ),其原理是依次对每条边进行松弛操作,重复这个操作E-1次后则一定得到最短路,如果还能继续松弛,则有负环.这是因为最长的 ...

  2. Bellman-Ford算法与SPFA算法详解

    PS:如果您只需要Bellman-Ford/SPFA/判负环模板,请到相应的模板部分 上一篇中简单讲解了用于多源最短路的Floyd算法.本篇要介绍的则是用与单源最短路的Bellman-Ford算法和它 ...

  3. 数据结构与算法--最短路径之Bellman算法、SPFA算法

    数据结构与算法--最短路径之Bellman算法.SPFA算法 除了Floyd算法,另外一个使用广泛且可以处理负权边的是Bellman-Ford算法. Bellman-Ford算法 假设某个图有V个顶点 ...

  4. 最短路径——Bellman-Ford算法以及SPFA算法

    说完dijkstra算法,有提到过朴素dij算法无法处理负权边的情况,这里就需要用到Bellman-Ford算法,抛弃贪心的想法,牺牲时间的基础上,换取负权有向图的处理正确. 单源最短路径 Bellm ...

  5. 最短路径算法之四——SPFA算法

    SPAF算法 求单源最短路的SPFA算法的全称是:Shortest Path Faster Algorithm,该算法是西南交通大学段凡丁于1994年发表的. 它可以在O(kE)的时间复杂度内求出源点 ...

  6. 最短路径算法 4.SPFA算法(1)

    今天所说的就是常用的解决最短路径问题最后一个算法,这个算法同样是求连通图中单源点到其他结点的最短路径,功能和Bellman-Ford算法大致相同,可以求有负权的边的图,但不能出现负回路.但是SPFA算 ...

  7. 最短路径问题---Floyed(弗洛伊德算法),dijkstra算法,SPFA算法

    在NOIP比赛中,如果出图论题最短路径应该是个常考点. 求解最短路径常用的算法有:Floyed算法(O(n^3)的暴力算法,在比赛中大概能过三十分) dijkstra算法 (堆优化之后是O(MlogE ...

  8. 图论之最短路径(3)队列优化的Bellman-Ford算法(SPFA算法)

    在Bellman-Ford算法中 我们可以看到大量的优化空间:如果一个点的最短路径已经确定了,那么它就不会再改变,因此不需要再处理.换句话说:我们每次只对最短路径改变了的顶点的所有出边进行操作 使用一 ...

  9. 最短路和次短路的条数(dijstra算法或spfa算法)POJ3463

    http://poj.org/problem?id=3463 Sightseeing Time Limit: 2000MS   Memory Limit: 65536K Total Submissio ...

随机推荐

  1. Eclipse打包Android项目时用到proguard.cfg后,出现的Warning:can&#39;t find referenced class问题的解决方式

    Warning: can't find superclass or interface Warning: can't find referenced class 这两个问题的解决方法: 1.要把你项目 ...

  2. Arduino 网络时钟client

    升级! 添加了12h/24h 的开关,还有标准/ 夏令时开关!见步骤7 & 步骤8. 你是否曾想要一个和办公室时间来源全然准确的表? 这就有一个网络的办公时间server,你能够根据它并同步你 ...

  3. 面向对象五大原则_1.单一职责原则&amp;2.里氏替换原则

    单一职责原则:Single Responsibility Principle (SRP) 一个类.仅仅有一个引起它变化的原因.应该仅仅有一个职责.每个职责都是变化的一个轴线.假设一个类有一个以上的职责 ...

  4. python第三方库系列之十八--python/django test库

    django是属于python语音的web框架,要说django測试.也能够先说说python的測试.django能够用python的方式測试,当然,django也基于python封装了一个自己的測试 ...

  5. Session 钝化机制

  6. 常用的sql命令

    1 mysql创建数据库 create database [database name]; 2 创建表 create table [table name]([first column name] [f ...

  7. org.gradle.api.publication.maven.internal.DefaultMavenFactory错误

    Error:Unable to load class 'org.gradle.api.publication.maven.internal.DefaultMavenFactory'. Possible ...

  8. NIO原理图

  9. (linux)likely和unlikely函数

      在Linux内核中likely和unlikely函数有两种(只能两者选一)实现方式,它们的实现原理稍有不同,但作用是相同的,下面将结合linux-2.6.38.8版本的内核代码来进行讲解. 1.对 ...

  10. 使用sql compare生成的sql语句

    创建表以及主键 判断表是否存在 OBJECT_ID 判断主键是否存在 SELECT 1 FROM sys.indexes WHERE name = N'PK_LISA_NoUseWebpartRepl ...