其他链接
来自以上题解的图片来自常暗踏阴
使用前向星链表存图
直接用队列优化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的更多相关文章
-
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 [模板]单源最短路径 ...
-
HDOJ 2544 最短路(最短路径 dijkstra算法,SPFA邻接表实现,floyd算法)
最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
随机推荐
-
Android从assets目录下读取文件相关
有一个需求是app的帮助文档是word格式,ios可以直接用webview加载word显示,Android不行.而美工不配合转换成图片,前端没时间把word写成html 没办法,自己搞. 步骤: 1. ...
-
获取iOS设备型号iphone ipad
#import <sys/sysctl.h> //获得设备型号 -(NSString *)getCurrentDeviceModel { int mib[2]; size_t len; c ...
-
apache多站点配置
apache多站点配置 临时需要个测试站,然后就到apache中配置vhosts,结果这货总是显示"拒绝了你的请求",找半天发现居然还要添加端口监听 vhosts.conf 添加v ...
-
【Android进阶】判断网络连接状态并自动界面跳转
用于判断软件打开时的网络连接状态,若无网络连接,提醒用户跳转到设置界面 /** * 设置在onStart()方法里面,可以在界面每次获得焦点的时候都进行检测 */ @Override protecte ...
-
Why database migrations?
https://flywaydb.org/getstarted/why First, let's start from the beginning and assume we have a proje ...
-
Springboot 学习遇到的一些错和埋坑之旅
1. java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @Cont ...
-
剑指offer三十八之二叉树的深度
一.题目 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 二.思路 递归,详见代码. 三.代码 public class So ...
-
关于spring-mvc.xml的mvc:resources元素浅析。
配置如下: <!-- 配置静态资源 --><mvc:resources location="/static/" mapping="/static/**& ...
-
C/S模式与B/S模式的详细介绍
网络程序开发的两种计算模式--C/S模式与B/S模式.两种各有千秋,用于不同场合. C/S适用于专人使用,安全性要求较高的系统: B/S适用于交互性比较频繁的场合,容易被人们所接受,倍受用户和软件开发 ...
-
ASP.NET Core 2.0 源代码
ASP.NET Core 2.0 源代码 在Visual Studio 2017中可以通过符号以及源链接,非常方便对 ASP.NET Core 2.0中源代码进行调试.在这篇文章中,我们将重点介绍如何 ...