图论之最短路算法之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 ...
随机推荐
- Servlet的部署开发细节以及注意事项
学习servlet最困难的我感觉还是配置,一開始是非常麻烦的.为了较好的学习,一開始还是以手动开发我认为比較好,可是真的有点把握给搞晕了,尤其是部署servlet方面非常麻烦,这里做一下简单的总结,前 ...
- C++经典面试题解析
1. // BlankTest.cpp : 定义控制台应用程序的入口点. //题目:将一个文件中的一组整数排序后输出到另一个文件中 #include "stdafx.h" #inc ...
- MongoDB:分片(简介 & 自动分片 & 片键)
分片(增加服务器,水平扩展)是MongoDB的扩展方式,通过分片能过增加更多的机器来应对不断增加的负载和数据,还不影响应用. [简介] 分片(sharding)是指将数据拆分,将其分散存在不同的机器上 ...
- 嵌入式开发之davinci--- 8168 question about capture PAL on 8168
http://e2e.ti.com/support/dsp/davinci_digital_media_processors/f/717/t/340483.aspx?pi199607=2
- Android cookies正确的更新方式
之前的更新方式 一搜cookies的使用,非常easy搜到非常多文章.主要的几步大致同样.例如以下图: 基本上都要求大家先调用cookieManager.removeAllCookie()或者调用 c ...
- td 中设置超出宽度显示省略号失效
td测试内容超出显示省略号时,结果没有显示省略号,而是一直往后显示,且超出了td大小,强行挤大了table. 原因是因为td默认不换行. 解决方法: 1.强制td换行. IE加上word-break: ...
- Quartz -第一篇-入门
学习地址:https://www.imooc.com/learn/846 官网:www.quartz-scheduler.org 特点:分布式+集群 设计模式: 工厂模式 builder模式 组件模式 ...
- KbmMW资源汇总(特别是xalion的文章)
KbmMW框架是收费的,不在此提供下载,如需购买,请自行联系作者Kim Madsen. 网址资源: 官网主页:http://www.components4programmers.com/product ...
- vue开发:移动端图片上传
因为最近遇到个移动端上传头像的需求,上传到后台的数据是base64位,其中为了提高用户体验,把比较大的图片用canvas进行压缩之后再进行上传.在移动端调用拍照功能时,会发生图片旋转,为了解决这个问题 ...
- [原创]JAVA获取word表格中数据的方案
上一个项目的开发中需要实现从word中读取表格数据的功能,在JAVA社区搜索了很多资料,终于找到了两个相对最佳的方案,因为也得到了不少网友们的帮助,所以不敢独自享用,在此做一个分享. 两个方案分别是: ...