SPFA算法(shortest path faster algorithm)算法是西南交通大学段凡丁于1994年发表的,它在Bellman-ford算法的基础上进行了改进,使其在能够处理待负权图的单元最短路径的基础上,时间复杂度大幅度降低。

算法核心:设立一个先进先出的队列用来保存待优化的节点,优化时每次取出队首节点u,并且用u点当前的最短路径估计值对离开u点所指向的节点v进行松弛操作,如果v点的最短路径估计值有所调整,且v点不在当前的队列中,就将v点放入队尾。这样不断从从队列中取出节点进行松弛操作,直至队列空为止。

SPFA算法同样可以判断负环,如果某个点弹出队列的次数超过n-1次,则存在负环。对于存在负环的图,无法计算单源最短路径。

#include<iostream>
#include<queue>
#include<algorithm>
#include<set>
#include<cmath>
#include<vector>
#include<map>
#include<stack>
#include<bitset>
#include<cstdio>
#include<cstring>
#define Swap(a,b) a^=b^=a^=b
#define cini(n) scanf("%d",&n)
#define cinl(n) scanf("%lld",&n)
#define cinc(n) scanf("%c",&n)
#define cins(s) scanf("%s",s)
#define coui(n) printf("%d",n)
#define couc(n) printf("%c",n)
#define coul(n) printf("%lld",n)
#define speed ios_base::sync_with_stdio(0)
#define Max(a,b) a>b?a:b
#define Min(a,b) a<b?a:b
#define mem(n,x) memset(n,x,sizeof(n))
#define INF  0x3f3f3f3f
#define maxn  100010
#define Ege 100000000
#define Vertex 1005
#define esp  1e-9
#define mp(a,b) make_pair(a,b)
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
struct Node
{int to, lat, val; //边的右端点,边下一条边,边权
};
Node edge[1000005];
int head[1005],tot,dis[1005],N,M,vis[1005];
void add(int from, int to, int dis)
{edge[++tot].lat = head[from];edge[tot].to = to;edge[tot].val = dis;head[from] = tot;}
void spfa(int s)
{memset(dis, 0x3f, sizeof(dis));dis[0]=0;memset(vis, 0, sizeof(vis));vis[s] = 1;dis[s] = 0;queue<int>Q;Q.push(s);while (!Q.empty()) {int u = Q.front();Q.pop();vis[u] = 0;for (int i = head[u];i;i = edge[i].lat) {int to = edge[i].to;int di = edge[i].val;if (dis[to]>dis[u] + di) {dis[to] = dis[u] + di;if (!vis[to]) {vis[to] = 1;Q.push(to);}}}}}
int main()
{int t, x;scanf("%d", &t);while (t--){memset(head, 0, sizeof(head));cini(N),cini(M);while (M--){int a, b, dis;scanf("%d %d %d", &a, &b, &dis);add(a, b, dis),add(b,a,dis);}cini(x);spfa(x);}return 0;
}

图论--最短路--SPFA相关推荐

  1. 洛谷P1346-电车【日常图论,最短路,SPFA】

    题目 一个有向图,每个点有个默认方向和若干个其他方向,走默认方向权值为0,其他方向权值为1,求最短路 输入 3 2 1(3个点,点2到点1) 2 2 3(2个点,起点为1,2为默认点,3为其他点) 2 ...

  2. 图论--最短路--SPFA模板(能过题,真没错的模板)

    [ACM常用模板合集] #include<iostream> #include<queue> #include<algorithm> #include<set ...

  3. 洛谷P2296-寻找道路【日常图论,最短路,SPFA】

    题目 一个有向图,要求满足要求的最短路径,要求为: 路径上的所有点的出边所指向的点都直接或间接与终点连通. 输入1 3 2 (3个点,2条边) 1 2 (1和2之间可以连接) 2 1 1 3 (从1到 ...

  4. 图论最短路:Bellman-Ford与其优化SPFA算法的一点理解

    文章目录 前言 一.对Bellman-Ford的深入理解 1. Bellman-Ford有什么用? 2. 什么是松弛操作? 3. Bellman-Ford的k次迭代意义? 4. 一个重要定理 5. 对 ...

  5. 【挑战程序设计】- 2.5 图论(最短路、最小生成树)

    2.5 图论(最短路.最小生成树) 文章目录 2.5 图论(最短路.最小生成树) 2.5.1 定义们 2.5.2 图的表示 2.5.3 图的搜索 2.5.4 最短路问题 单源1:bellman-for ...

  6. 【阿良的算法之路】图论最短路算法模板

    图论: [阿良的算法之路]图论最短路算法模板 [模板]dirjkstra单源最短路径 [模板]Bellman-Ford多源最短路 [模板]Spfa求最短路 [模板]Spfa判断负环 [模板]Floya ...

  7. 洛谷P1462 通往奥格瑞玛的道路 二分答案+最短路SPFA

    洛谷P1462 通往奥格瑞玛的道路 二分答案+最短路SPFA 二分交费最多的一次的钱数 然后只将符合要求的边加入图中 如果到终点的最短路大于等于血量 或者直接起点不能到达终点 那么说明不符合要求 需要 ...

  8. bzoj4144 [AMPPZ2014]Petrol 图论 最短路 并查集

    bzoj4144 [AMPPZ2014]Petrol 图论 最短路 并查集 1.这道题我们主要就是要求出距离一个油站的最近的油站 首先我们dijkstra 求出任意一个点到 离他最近的油站的距离 2. ...

  9. 【图论-最短路变形】想越狱的小杉

    [图论-最短路变形]想越狱的小杉 Time Limit:1000MS  Memory Limit:65536K Description 背景 Background 这次小杉来到了经典美剧<越狱& ...

最新文章

  1. 马斯克脑机接口、BrainOS相继发布,不努力也能有出路了
  2. 17岁成研究生,20岁被劝退,38岁“神童”离世
  3. oracle9I收缩表,Oracle 9i删除数据表(转)
  4. “星斗奖”九大类奖项揭晓:好未来、四川航空,瑞幸咖啡杨飞、中青旅张晓磊等入选...
  5. 本周ASP.NET英文技术文章推荐[10/21 – 10/27]
  6. python在线问卷调查系统源代码_基于Python 练习1情况的在线问卷
  7. solidworks批量图号分离_SolidWorks图号分离宏-不需要特殊符号
  8. bootstrap-table全选当前页所有数据checkAll
  9. Android 系统(229)---OTA
  10. layoutSubview调用条件
  11. javascript的内置对象
  12. EasyRecovery恢复数据的具体步骤是什么
  13. Python 获得汉字笔画
  14. 我的Android进阶之旅------Android中编解码学习笔记
  15. 【人月神话】01 人月神话
  16. ADS1115的IIC通信
  17. 关于计算机科学的publication(zz南大小百合)
  18. matlab中指数信号,Matlab入门篇——正弦信号、实指数信号和复指数信号仿真.ppt...
  19. FLOWABLE 流程中的自动跳过
  20. html模版i7,2017万元级专业制图 Intel最新七代i7-7700K专业建模渲染设计师电脑配置推荐...

热门文章

  1. iptables详解(13):iptables动作总结之二
  2. centos7同一服务器安装两个或多个Tomcat
  3. CSS拉伸resize
  4. 分布式存储MooseFS的搭建
  5. Ubuntu 12.04安装英汉词典
  6. 人生应该记住的16句话
  7. 名企进名校精选IT人 07年毕业生就业看好
  8. 图形验证码校验php,ThinkPHP实现生成和校验验证码功能
  9. r语言合并多个csv文件_PDF合并怎么做?分享多个PDF文件合并的方法
  10. 我的SSH JDBC数据源配置