题目链接

本题解来源

其他链接

卡spfa的数据组

题解堆优化的dijkstra

题解spfa讲解

来自以上题解的图片来自常暗踏阴

使用前向星链表存图

直接用队列优化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的更多相关文章

  1. SPFA 最短路算法

    SPFA算法 1.什么是spfa算法? SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环.SPFA一般情况复杂度是O(m)O(m) ...

  2. Johnson算法:多源最短路算法

    Johnson算法 请不要轻易点击标题 一个可以在有负边的图上使用的多源最短路算法 时间复杂度\(O(n \cdot m \cdot log \ m+n \cdot m)\) 空间复杂度\(O(n+m ...

  3. SPFA最短路算法

    SPFA是改良后的BellmanFord(在刘汝佳的入门经典2上,甚至直接将SPFA归为BellmanFord的队列优化版本). 这是算法的伪代码 d[s] = 0, 其余d[?] = INF; 将s ...

  4. dijkstra,belllman-ford,spfa最短路算法

    参考博客 时间复杂度对比: Dijkstra:  O(n2) Dijkstra + 优先队列(堆优化):  O(E+V∗logV) SPFA:  O(k∗E) ,k为每个节点进入队列的次数,一般小于等 ...

  5. Dijkstra算法——单源最短路算法

    一.介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他各个节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 适用于有 ...

  6. 最短路算法之 Dijkstra算法

    Dijkstra算法 Dijkstra算法是典型最短路算法,用于计算一个节点到其它全部节点的最短路径. 主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法能得出最短路径的最 ...

  7. [ACM] 最短路算法整理(bellman_ford , SPFA , floyed , dijkstra 思想,步骤及模板)

    以杭电2544题目为例 最短路 Problem Description 在每年的校赛里,全部进入决赛的同学都会获得一件非常美丽的t-shirt. 可是每当我们的工作人员把上百件的衣服从商店运回到赛场的 ...

  8. 【最短路算法】Dijkstra+heap和SPFA的区别

    单源最短路问题(SSSP)常用的算法有Dijkstra,Bellman-Ford,这两个算法进行优化,就有了Dijkstra+heap.SPFA(Shortest Path Faster Algori ...

  9. 图论之最短路算法之SPFA算法

    SPFA(Shortest Path Faster Algorithm)算法,是一种求最短路的算法. SPFA的思路及写法和BFS有相同的地方,我就举一道例题(洛谷--P3371 [模板]单源最短路径 ...

随机推荐

  1. dos模式下切换电脑用户

    启用管理员运行dos 然后输入net user adminstrator /active.yes 然后点击打开按钮 就可以切换电脑用户了

  2. Node.js 搭建 https 协议 服务器

    var https = require('https'); //创建服务器 https var fs = require('fs'); //文件系统的模块 const hostname = '127. ...

  3. 解决SVN提交和更新代码冲突?

    解决冲突有三种选择: 1.放弃自己的更新,使用svn revert(回滚),然后提交.在这种方式下不需要使用svn resolved(解决) 2.放弃自己的更新,使用别人的更新.使用最新获取的版本覆盖 ...

  4. java消息服务学习之JMS概念

    JMS即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信. ...

  5. java线程学习之wait方法

    wait 等待方法是让线程进入等待队列,使用方法是 obj.wait(); 这样当前线程就会暂停运行,并且进入obj的等待队列中,称作“线程正在obj上等待”. 如果线程想执行 wait 方法,线程必 ...

  6. ubuntu 下安装 navicat 12

    一.去官网下载navicat112_premium_cs_x64 for linux版本二.用tar解压安装包三.navicat解压即可用,直接进入解压后的目录,然后用‘./’运行start_navi ...

  7. 安卓GreenDao(基础)

    GreenDao的基础使用很简单,网上一大筐,推荐在简书里面搜索,那么我这里要说些什么呢,试想,这些简单的Demo可以带你了解GreenDao,但你能用这些代码做公司的项目么,肯定不行,所以我结合自身 ...

  8. Event and Delegate

    文章著作权归作者所有.转载请联系作者,并在文中注明出处,给出原文链接. 本文原更新于作者的github博客,这里给出链接. 委托 委托的实质是一个类. // 委托定义 delegate ReturnT ...

  9. 快速安装 Laravel 5.7

    $ git clone https://github.com/laravel/laravel.git $ cd laravel $ cp .env.example .env $ composer in ...

  10. shell实现大批量word转码然后分析相关字段

    需求 需要从服务器中的所有附件(2013-2019) 共60G查找相关字段 在linux上面直接打开doc等是乱码的 思路 先全部附件转码为txt, 然后用grep遍历查找字段实现 转码shell # ...