SPFA算法求最短路
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算法求最短路相关推荐
- 2019中山纪念中学夏令营-Day14 图论初步【dijkstra算法求最短路】
Dijkstra是我学会的第一个最短路算法,为什么不先去学SPFA呢?因为我在luogu上翻到了一张比较神奇的图: 关于SPFA -它死了 以及网上还有各位大佬的经验告诉我:SPFA这玩意很容易被卡. ...
- POJ 3255(迪杰斯特拉算法求次短路)
POJ3255,问题是求节点1到n的次短路. 在dijkstra求最短路算法的基础上进行变形,用两个数组分别记录源点到各节点最短路径和次短路径: 每次更新时,都将最短路的节点及可能成为次短路的节点pu ...
- SPFA算法求固定点到其它点 最短 最长 路程问题
点击:理解请参考 例题:https://www.luogu.com.cn/problem/P1807 如果求最短路径 :vis[nex] = min(vis[nex], vis[now]+B[now] ...
- Floyd算法求最短路
Floyd算法(基于动态规划):用于求多源汇最短路 初始化:用邻接矩阵d[i,j]存储中所有的边,floyd算法就是三重循环 for(k = 1;k <= n;k ++){ for(i = 1; ...
- 【单源最短路】Dijkstra算法求最短路
题目描述 给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为正值. 请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 −1. 输入格式 第一 ...
- Dijkstra算法求最短路
一.算法描述 Dijkstra算法的流程如下: 1.初始化dist[1] = 0,其余节点的dist值为无穷大. 2.找出一个未被标记的.dist[x]最小的节点x,然后标记节点x. 3.扫描节点x的 ...
- ACM算法--spfa算法--最短路算法
求单源最短路的SPFA算法的全称是:Shortest Path Faster Algorithm. SPFA算法是西南交通大学段凡丁于1994年发表的. 从名字我们就可以看出,这种算 ...
- 最短路算法 :Bellman-ford算法 Dijkstra算法 floyd算法 SPFA算法 详解
本文链接 :http://www.cnblogs.com/Yan-C/p/3916281.html . 在本文中因为邻接表在比赛中不如前向星好写,而且前向星效率并不低所以,本文的代码 存图只 ...
- spfa 单源最短路究极算法
学习博客链接:SPFA 求单源最短路的SPFA算法的全称是:Shortest Path Faster Algorithm. SPFA算法是西南交通大学段凡丁于1994年发表的. 从名 ...
最新文章
- Spring Boot 结合 Redis 缓存
- 什么是Busybox,简单使用
- CoreLocation MKMapView
- PriorityBlockingQueue用法
- linux下puppet的“资源”管理
- 在RHEL5.4上做YUM
- python第一周:python初识、流程控制
- c#反混淆工具de4dot 一般混淆都可以解决
- python中日期和时间格式化输出的方法
- LightMapping和LightProbe
- FPGA、AD9371、AD9009、RF SOC介绍
- flash cs4 是过渡性产品吗?
- 2020年度美国最受市场欢迎的十大编程语言
- 上班划水,给男朋友做个数字炸弹游戏
- sql insert
- pack_padded_sequence torch说明
- Android NFC识别CPU卡和m1卡
- QT学习笔记(一)之本地播放器
- 【中级计量经济学】Lecture 2 多重共线性
- 基于PySpark的航天日志分析(SQL分析)