图论之最短路算法之SPFA算法
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算法的更多相关文章
- Bellman-ford算法、SPFA算法求解最短路模板
Bellman-ford 算法适用于含有负权边的最短路求解,复杂度是O( VE ),其原理是依次对每条边进行松弛操作,重复这个操作E-1次后则一定得到最短路,如果还能继续松弛,则有负环.这是因为最长的 ...
- Bellman-Ford算法与SPFA算法详解
PS:如果您只需要Bellman-Ford/SPFA/判负环模板,请到相应的模板部分 上一篇中简单讲解了用于多源最短路的Floyd算法.本篇要介绍的则是用与单源最短路的Bellman-Ford算法和它 ...
- 数据结构与算法--最短路径之Bellman算法、SPFA算法
数据结构与算法--最短路径之Bellman算法.SPFA算法 除了Floyd算法,另外一个使用广泛且可以处理负权边的是Bellman-Ford算法. Bellman-Ford算法 假设某个图有V个顶点 ...
- 最短路径——Bellman-Ford算法以及SPFA算法
说完dijkstra算法,有提到过朴素dij算法无法处理负权边的情况,这里就需要用到Bellman-Ford算法,抛弃贪心的想法,牺牲时间的基础上,换取负权有向图的处理正确. 单源最短路径 Bellm ...
- 最短路径算法之四——SPFA算法
SPAF算法 求单源最短路的SPFA算法的全称是:Shortest Path Faster Algorithm,该算法是西南交通大学段凡丁于1994年发表的. 它可以在O(kE)的时间复杂度内求出源点 ...
- 最短路径算法 4.SPFA算法(1)
今天所说的就是常用的解决最短路径问题最后一个算法,这个算法同样是求连通图中单源点到其他结点的最短路径,功能和Bellman-Ford算法大致相同,可以求有负权的边的图,但不能出现负回路.但是SPFA算 ...
- 最短路径问题---Floyed(弗洛伊德算法),dijkstra算法,SPFA算法
在NOIP比赛中,如果出图论题最短路径应该是个常考点. 求解最短路径常用的算法有:Floyed算法(O(n^3)的暴力算法,在比赛中大概能过三十分) dijkstra算法 (堆优化之后是O(MlogE ...
- 图论之最短路径(3)队列优化的Bellman-Ford算法(SPFA算法)
在Bellman-Ford算法中 我们可以看到大量的优化空间:如果一个点的最短路径已经确定了,那么它就不会再改变,因此不需要再处理.换句话说:我们每次只对最短路径改变了的顶点的所有出边进行操作 使用一 ...
- 最短路和次短路的条数(dijstra算法或spfa算法)POJ3463
http://poj.org/problem?id=3463 Sightseeing Time Limit: 2000MS Memory Limit: 65536K Total Submissio ...
随机推荐
- Android--向SD卡读写数据
// 向SD卡写入数据 private void writeSDcard(String str) { try { // 推断是否存在SD卡 if (Environment.getExternalSto ...
- 使用string实现一个用于储存那些太大而无法使用 long long 的数
类的定义: class stringInt { public: stringInt(); stringInt(string num); stringInt(int num); stringInt op ...
- 查询历史使用过的命令并使用(history)
一.什么是history 在bash功能中.它能记忆使用过的命令,这个功能最大的优点就是能够查询以前做过的举动.从而能够知道你的执行步骤.那么就能够追踪你曾下达过的命令.以作为除错的工具. 二.His ...
- scala快速学习笔记(二):控制结构,类和对象
IV.控制结构 1.if/else 除基本用法外,if/else语句能用来赋值,进而代替?:运算符.这得益于在Scala中,每个语句块都有值,就是该语句块最后一个语句的值.请看下面的代码. def a ...
- WebService:JAX-WS实现WebService
WebService和Java核心技术中的RMI一样用于实现异构平台上的应用程序之间数据的交互,唯一不同的是这样的技术屏蔽了语言之间的差异.这也是其大行其道的原因. 实现WebService的技术多种 ...
- HDU 6183 Color it cdq分治 + 线段树 + 状态压缩
Color it Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) Pro ...
- MySQL基本语句优化10个原则
在数据库应用中,程序员们通过不断的实践总结了很多经验,这些经验是一些普遍适用的规则.每一个程序员都应该了解并记住它们,在构造SQL语句时,养成良好的习惯.以下10条比较重要的原则供大家参考. 原则1: ...
- DDD战略设计相关核心概念的理解
前言 本文想再讨论一下关于领域.业务.业务模型.解决方案.BC.领域模型.微服务这些概念的含义和关系.初衷是我发现现在DDD领域建模以及解决方案落地过程中,常常对这些概念理解不清楚或者有歧义,导致我们 ...
- axios基于常见业务场景的二次封装
axios axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中.在前端框架中的应用也是特别广泛,不管是vue还是react,都有很多项目用axios作为网络 ...
- DataContractAttribute.IsReference
IsReference property in data contract It determines how objects are serialized, by default, IsRefere ...