图论之最短路算法之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 ...
随机推荐
- Log4cpp 使用手册
参考资料: log4cpp 配置 与 使用http://www.cnblogs.com/welkinwalker/archive/2011/06/23/2088197.html 便利的开发工具-log ...
- HDU 1398 Square Coins(母函数或dp)
Square Coins Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- LeetCode_DP_Word Break II
LeetCode_Word Break II 一.题目描写叙述: 二.解决思路: 题目要求我们要在原字符串中加空格,使得隔开的每一个词都是词典中的词. 所以我们大能够按顺序扫描每一个字符.可是然后当碰 ...
- HashTable源代码剖析
<span style="font-size:14px;font-weight: normal;">public class Hashtable<K,V> ...
- Jenkins+appium+testng持续集成
Create maven project in eclipseAdd Appium , Selenium dependancyAdd Test in TestNG testCreate TestNG ...
- 设计模式学习笔记——Prototype原型模式
原型模型就是克隆. 还有深克隆.浅克隆,一切听上去都那么耳熟能详.
- Codeforces Round #422 (Div. 2) D. My pretty girl Noora 数学
D. My pretty girl Noora In Pavlopolis University where Noora studies it was decided to hold beau ...
- Class.forName("java.lang.String")的作用?
返回字节码: 返回的方式有2种: 第一种是这个类的字节码已经加载到内存里面来了,现在想要取到它的字节码,我直接找到那份字节码把他返回: 第二种是我去得到这个类的字节码,结果在虚拟机里面还没有这个类的字 ...
- using the flume-ng-sql-source plugin to push data from Mysql DB to Spark
org.apache.flume.EventDeliveryException while running flume and sending data to spark · Issue #21 · ...
- 使用Java绘制验证码
效果图: JDemo.java import java.io.File; import java.io.IOException; import static java.lang.System.out; ...