【算法】祭奠spfa 最短路算法dijspfa
其他链接
来自以上题解的图片来自常暗踏阴

使用前向星链表存图
直接用队列优化spfa
struct cmp
{
bool operator()(int a,int b)
{
return dist[a]>dist[b];
}
}; priority_queue<int,vector<int>,cmp> q;void dijspfa()
{
q.push(s);
memset(inq,,sizeof(inq));
memset(dist,0x7f,sizeof(dist));
dist[s]=;
while(!q.empty())
{
int u=q.top();
q.pop();inq[u]=;
for(int j=first[u];j>;j=e[j].nxt)
{
if(e[j].len+dist[u]<dist[e[j].to])
{
dist[e[j].to]=dist[u]+e[j].len;
if(inq[e[j].to]==)
{
q.push(e[j].to);inq[e[j].to]=;
}
}
}
}
}
dijspfa特性
1.判负环
spfa判负环主要用dfs,因为dfs判负环可以及时退出防止超时,
数据强化可以用bfs看下面
dijspfa判负环继承spfa的功能
但是可能过不了233
SPjkstra算法--就是本文的dijspfa
2.与dij,spfa比较
dij的思想是堆优化后从小到大松弛,每个点只入队一次
spfa的思想是不断修改子节点,使每个点重复入队更新,因此可以判负环
时间差异就在重复入队上
完整代码
#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
#define Mx 200001
#define Nx 100001
using namespace std;
struct edge
{
int to,nxt,len;
}e[Mx];
int first[Nx]; int n,m,s;
void addstar(int i,int u,int v,int w)
{
e[i].len=w;
e[i].nxt=first[u];
e[i].to=v;
first[u]=i;
}
int inq[Nx];
int dist[Nx]; struct cmp
{
bool operator()(int a,int b)
{
return dist[a]>dist[b];
}
}; priority_queue<int,vector<int>,cmp> q;
void dijspfa()
{
q.push(s);
memset(inq,,sizeof(inq));
memset(dist,0x7f,sizeof(dist));
dist[s]=;
while(!q.empty())
{
int u=q.top();
q.pop();inq[u]=;
for(int j=first[u];j>;j=e[j].nxt)
{
if(e[j].len+dist[u]<dist[e[j].to])
{
dist[e[j].to]=dist[u]+e[j].len;
if(inq[e[j].to]==)
{
q.push(e[j].to);inq[e[j].to]=;
}
}
}
}
}
int main()
{
memset(first,,sizeof(first));
cin>>n>>m>>s;
for(int i=;i<=m;++i)
{
int a,b,c;
cin>>a>>b>>c;
addstar(i,a,b,c);
}
dijspfa();
for(int i=;i<=n;++i)
{
cout<<dist[i]<<" ";
}
return ;
}
【算法】祭奠spfa 最短路算法dijspfa的更多相关文章
- SPFA 最短路算法
SPFA算法 1.什么是spfa算法? SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环.SPFA一般情况复杂度是O(m)O(m) ...
- Johnson算法:多源最短路算法
Johnson算法 请不要轻易点击标题 一个可以在有负边的图上使用的多源最短路算法 时间复杂度\(O(n \cdot m \cdot log \ m+n \cdot m)\) 空间复杂度\(O(n+m ...
- SPFA最短路算法
SPFA是改良后的BellmanFord(在刘汝佳的入门经典2上,甚至直接将SPFA归为BellmanFord的队列优化版本). 这是算法的伪代码 d[s] = 0, 其余d[?] = INF; 将s ...
- dijkstra,belllman-ford,spfa最短路算法
参考博客 时间复杂度对比: Dijkstra: O(n2) Dijkstra + 优先队列(堆优化): O(E+V∗logV) SPFA: O(k∗E) ,k为每个节点进入队列的次数,一般小于等 ...
- Dijkstra算法——单源最短路算法
一.介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他各个节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 适用于有 ...
- 最短路算法之 Dijkstra算法
Dijkstra算法 Dijkstra算法是典型最短路算法,用于计算一个节点到其它全部节点的最短路径. 主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法能得出最短路径的最 ...
- [ACM] 最短路算法整理(bellman_ford , SPFA , floyed , dijkstra 思想,步骤及模板)
以杭电2544题目为例 最短路 Problem Description 在每年的校赛里,全部进入决赛的同学都会获得一件非常美丽的t-shirt. 可是每当我们的工作人员把上百件的衣服从商店运回到赛场的 ...
- 【最短路算法】Dijkstra+heap和SPFA的区别
单源最短路问题(SSSP)常用的算法有Dijkstra,Bellman-Ford,这两个算法进行优化,就有了Dijkstra+heap.SPFA(Shortest Path Faster Algori ...
- 图论之最短路算法之SPFA算法
SPFA(Shortest Path Faster Algorithm)算法,是一种求最短路的算法. SPFA的思路及写法和BFS有相同的地方,我就举一道例题(洛谷--P3371 [模板]单源最短路径 ...
随机推荐
- MySQL中show profiles的开启
Query Profiler是MYSQL自带的一种query诊断分析工具,通过它可以分析出一条SQL语句的性能瓶颈在什么地方.通常我们是使用的explain,以及slow query log都无法做到 ...
- SAP基本计量单位更改(转载)
转载自:http://blog.csdn.net/sapmatinal/article/details/50997819 在SAP中物料创建后,一旦发生业务,其基本计量单位便很难修改.由于单位无法满足 ...
- radhat6.6上安装oracle12c RAC (一)
软件环境:VMware.redhat6.6.oracle12c(linuxx64_12201_database.zip).12cgrid(linuxx64_12201_grid_home.zip) 一 ...
- 页面适配的小栗子 - github
我模拟了一个QQ音乐的radiostation页面,用了媒体查询以及流式布局,页面大部分内容是js根据json生成的,使用了less来编写css样式表. 下面是仓库地址,感兴趣的小伙伴可以打开看看,将 ...
- UIPresentationController - iOS自定义模态弹出框
参考: https://developer.apple.com/library/archive/featuredarticles/ViewControllerPGforiPhoneOS/Definin ...
- Http协议&Servlet
http协议 针对网络上的客户端 与 服务器端在执行http请求的时候,遵守的一种规范. 其实就是规定了客户端在访问服务器端的时候,要带上哪些东西, 服务器端返回数据的时候,也要带上什么东西. 版本 ...
- topcoder srm 575 div1
problem1 link 如果$k$是先手必胜那么$f(k)=1$否则$f(k)=0$ 通过对前面小的数字的计算可以发现:(1)$f(2k+1)=0$,(2)$f(2^{2k+1})=0$,(3)其 ...
- day19
""" time 用于处理时间相关 1.获取时间 2.不同格式的时间转换 3.sleep函数"""import time# 浮点型的时间戳 ...
- ProtoType原型和__Proto__原型链的详解
var arr = new Array(12,13,14,15,16,17,18); var arr2 = new Array(12,13); arr.sun=function(){ //用原型加Ar ...
- Redis 错误:Failed with result 'start-limit-hit'
Redis 错误:Failed with result 'start-limit-hit' 背景 Redis 版本为 5.0.4: 文件 /etc/systemd/system/redis.servi ...