AcWing 851. spfa求最短路

题目

https://www.acwing.com/problem/content/submission/853/
给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可能为负数。
请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 impossible。
数据保证不存在负权回路。

思路

SPFA是对Bellman_ford算法的优化

  • SPFA算法是由Bellman_ford算法优化而来,在最坏的情况下时间复杂度和它一样即时间复杂度为O(nm)
  • 求负环一般使用SPFA算法,方法是用一个cnt数组记录每个点到源点的边数,一个点被更新一次就+1,一旦有点的边数达到了n那就证明存在了负环。

算法执行步骤:

  • 建立一个队列,初始时队列里只有起始点。
  • 再建立一个数组记录起始点到所有点的最短路径(该表格的初始值要赋为极大值,该点到他本身的路径赋为0)。
  • 再建立一个数组,标记点是否在队列中。
  • 队头不断出队,计算始点起点经过队头到其他点的距离是否变短,如果变短且被点不在队列中,则把该点加入到队尾。
  • 重复执行直到队列为空。
  • 在保存最短路径的数组中,就得到了最短路径。

代码O(m)最坏O(nm)

#include<bits/stdc++.h>
using namespace std;typedef long long LL;
const int N=100010;
int h[N],e[N],ne[N],w[N],idx;//邻接表存图
bool st[N];
int dist[N];
int n,m;void add(int a,int b,int c)
{w[idx]=c,e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}int spfa()
{memset(dist,0x3f,sizeof dist);dist[1]=0;queue<int> q;q.push(1);st[1]=true;while(q.size()){int t=q.front();q.pop();st[t]=false;for(int i=h[t];~i;i=ne[i]){int j=e[i];if(dist[j]>dist[t]+w[i]){dist[j]=dist[t]+w[i];if(!st[j]){q.push(j);st[j]=true;}}}}return dist[n];
}int main()
{cin>>n>>m;memset(h,-1,sizeof h);while(m--){int a,b,c;cin>>a>>b>>c;add(a,b,c);}int t=spfa();if(t==0x3f3f3f3f) cout<<"impossible";else cout<<t;return 0;
}

SPFA算法求最短路相关推荐

  1. 2019中山纪念中学夏令营-Day14 图论初步【dijkstra算法求最短路】

    Dijkstra是我学会的第一个最短路算法,为什么不先去学SPFA呢?因为我在luogu上翻到了一张比较神奇的图: 关于SPFA -它死了 以及网上还有各位大佬的经验告诉我:SPFA这玩意很容易被卡. ...

  2. POJ 3255(迪杰斯特拉算法求次短路)

    POJ3255,问题是求节点1到n的次短路. 在dijkstra求最短路算法的基础上进行变形,用两个数组分别记录源点到各节点最短路径和次短路径: 每次更新时,都将最短路的节点及可能成为次短路的节点pu ...

  3. SPFA算法求固定点到其它点 最短 最长 路程问题

    点击:理解请参考 例题:https://www.luogu.com.cn/problem/P1807 如果求最短路径 :vis[nex] = min(vis[nex], vis[now]+B[now] ...

  4. Floyd算法求最短路

    Floyd算法(基于动态规划):用于求多源汇最短路 初始化:用邻接矩阵d[i,j]存储中所有的边,floyd算法就是三重循环 for(k = 1;k <= n;k ++){ for(i = 1; ...

  5. 【单源最短路】Dijkstra算法求最短路

    题目描述 给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为正值. 请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 −1. 输入格式 第一 ...

  6. Dijkstra算法求最短路

    一.算法描述 Dijkstra算法的流程如下: 1.初始化dist[1] = 0,其余节点的dist值为无穷大. 2.找出一个未被标记的.dist[x]最小的节点x,然后标记节点x. 3.扫描节点x的 ...

  7. ACM算法--spfa算法--最短路算法

    求单源最短路的SPFA算法的全称是:Shortest Path Faster Algorithm.      SPFA算法是西南交通大学段凡丁于1994年发表的.     从名字我们就可以看出,这种算 ...

  8. 最短路算法 :Bellman-ford算法 Dijkstra算法 floyd算法 SPFA算法 详解

     本文链接   :http://www.cnblogs.com/Yan-C/p/3916281.html . 在本文中因为邻接表在比赛中不如前向星好写,而且前向星效率并不低所以,本文的代码 存图只 ...

  9. spfa 单源最短路究极算法

    学习博客链接:SPFA 求单源最短路的SPFA算法的全称是:Shortest Path Faster Algorithm.      SPFA算法是西南交通大学段凡丁于1994年发表的.     从名 ...

最新文章

  1. Spring Boot 结合 Redis 缓存
  2. 什么是Busybox,简单使用
  3. CoreLocation MKMapView
  4. PriorityBlockingQueue用法
  5. linux下puppet的“资源”管理
  6. 在RHEL5.4上做YUM
  7. python第一周:python初识、流程控制
  8. c#反混淆工具de4dot 一般混淆都可以解决
  9. python中日期和时间格式化输出的方法
  10. LightMapping和LightProbe
  11. FPGA、AD9371、AD9009、RF SOC介绍
  12. flash cs4 是过渡性产品吗?
  13. 2020年度美国最受市场欢迎的十大编程语言
  14. 上班划水,给男朋友做个数字炸弹游戏
  15. sql insert
  16. pack_padded_sequence torch说明
  17. Android NFC识别CPU卡和m1卡
  18. QT学习笔记(一)之本地播放器
  19. 【中级计量经济学】Lecture 2 多重共线性
  20. 基于PySpark的航天日志分析(SQL分析)

热门文章

  1. OpenGL实验:绘制彩色五角星
  2. jboss一个bogon引发的思考
  3. IDS相机SDK二次开发
  4. printf输出补零
  5. APP推广路上的拦路虎
  6. AutoSAR系列讲解(入门篇)5.4-ECU的项目流程
  7. 详细到燃起来的Xampp安装配置环境教程及相关问题解决(图文并茂)
  8. git仓库上传代码过程
  9. 安全工具-Arachni
  10. 双智机器人 珠海_甄少强:美的机器人“双智”战略正当时