YY引言

在NOI2018D1T1中出现了一些很震惊的情况,D1T1可以用最短路解决,但是大部分人都在用熟知的SPFA求解最短路。而SPFA的最坏复杂度能够被卡到$O(VE)$。就是边的数量乘以点的数量,而用SPFA的各位都被恶意数据卡成了最坏情况。100->60。这显然很不划算。是时候祭出我们的堆优化$dijkstra$了。

核心思想

朴素的dijkstra的核心是一个贪心的过程。每次找当前已知权值的最小的边来进行松弛。但是每次找的过程中都要用$O(m)$的时间。这样很慢。时间复杂度是$O((m+n)n)$。这显然不是我们想要的结果。小根堆的特性是保证堆顶的数是最小的数,所以我们可以用小根堆来替换贪心找最小权值的过程。而使用了小根堆之后的$dijkstra$算法的时间复杂度就变成了$O((m+n)\log n)$,而且很稳定。

代码实现

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue> using namespace std; typedef pair<long long, int> P;
const int maxedge = 2e5+3;
const int maxnode = 1e5+3;
priority_queue<P, vector<P>, greater<P> > Q;
int fir[maxnode], nx[maxedge], u[maxedge], v[maxedge], w[maxedge];
int dis[maxnode], n, m, s;
bool book[maxnode];
inline int read() {
int x = 0, f = 1; char c = getchar();
while (c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while (c <= '9' && c >= '0') {x = x*10 + c-'0'; c = getchar();}
return x * f;
} int main() {
n = read(), m = read(), s = read();
memset(fir, -1, sizeof(fir));
fill(dis+1, dis+1+n, 2147483647);
for(int i=1; i<=m; i++) {
u[i] = read(), v[i] = read(), w[i] = read();
nx[i] = fir[u[i]];
fir[u[i]] = i;
}
dis[s] = 0;
Q.push(P(0, s));
while (!Q.empty()) {
P x = Q.top();
Q.pop();
if(x.first > dis[x.second])
continue;
int k = fir[x.second];
while (k != -1) {
if(x.first + w[k] < dis[v[k]]) {
dis[v[k]] = w[k] + x.first;
Q.push(P(dis[v[k]], v[k]));
}
k = nx[k];
}
}
for(int i=1; i<=n; i++) printf("%d ", dis[i]);
}

  

模板题目

Luogu P4779,这个题卡SPFA

Luogu P3371,这个题不卡SPFA

关于dijkstra的小根堆优化的更多相关文章

  1. dijkstra算法的堆优化

    普通的dijkstra算法模板: //数据结构 int g[LEN][LEN]; //邻接矩阵 int vis[LEN]; //标记是否访问 int dist[LEN] //源点到各点的距离 fill ...

  2. 单源最短路径:Dijkstra算法(堆优化)

    前言:趁着对Dijkstra还有点印象,赶快写一篇笔记. 注意:本文章面向已有Dijkstra算法基础的童鞋. 简介 单源最短路径,在我的理解里就是求从一个源点(起点)到其它点的最短路径的长度. 当然 ...

  3. 【Luogu P4779】dijkstra算法的堆优化

    Luogu P4779 利用堆/优先队列快速取得权值最小的点. 在稠密图中的表现比SPFA要优秀. #include<iostream> #include<cstdio> #i ...

  4. POJ-2387.Til the Cows Come Home.(五种方法:Dijkstra + Dijkstra堆优化 + Bellman-Ford + SPFA + Floyd-Warshall)

    昨天刚学习完最短路的算法,今天开始练题发现我是真的菜呀,居然能忘记邻接表是怎么写的,真的是菜的真实...... 为了弥补自己的菜,我决定这道题我就要用五种办法写出,并在Dijkstra算法堆优化中另外 ...

  5. 手写堆优化dijkstra

    \(dijkstra\) 算法的堆优化,时间复杂度为\(O(n+m)\log n\) 添加数组\(id[]\)记录某节点在堆中的位置,可以避免重复入堆从而减小常数 而这一方法需要依托手写堆 #incl ...

  6. 单源最短路问题--朴素Dijkstra & 堆优化Dijkstra

    许久没有写博客,更新一下~ Dijkstra两种典型写法 1. 朴素Dijkstra     时间复杂度O(N^2)       适用:稠密图(点较少,分布密集) #include <cstdi ...

  7. POJ 2502 - Subway Dijkstra堆优化试水

    做这道题的动机就是想练习一下堆的应用,顺便补一下好久没看的图论算法. Dijkstra算法概述 //从0出发的单源最短路 dis[][] = {INF} ReadMap(dis); for i = 0 ...

  8. BZOJ 3040 最短路 (堆优化dijkstra)

    这题不是裸的最短路么?但是一看数据范围就傻了.点数10^6,边数10^7.这个spfa就别想了(本来spfa就是相当不靠谱的玩意),看来是要用堆优化dijkstra了.但是,平时写dijkstra时为 ...

  9. Dijkstra算法的二叉堆优化

    Dijkstra算法的二叉堆优化 算法原理 每次扩展一个距离最小的点,再更新与其相邻的点的距离. 如何寻找距离最小的点 普通的Dijkstra算法的思路是直接For i: 1 to n 优化方案是建一 ...

随机推荐

  1. a non-linear editing software

    VLMC, open source video editor - VideoLAN http://www.videolan.org/vlmc/

  2. sql compare options

    sql compare project's options Add object existence checks Use DROP and CREATE instead of ALTER Ignor ...

  3. git log 常用选项

    git log 常用选项 -p 按补丁格式显示每个更新之间的差异. jiqing@Ubuntu:/home/wwwroot/default/5hao/sheep$ git log -p commit ...

  4. JFreeChart生成饼形图(3)11 (转自 JSP开发技术大全)

    FreeChart生成饼形图(3) (转自 JSP开发技术大全) 14.3 利用JFreeChart生成饼形图 通过JFreeChart插件,即可以生成普通效果的饼形图,也可以生成3D效果的饼形图:如 ...

  5. 【Silverlight】Bing Maps学习系列(四):使用图钉层(Pushpin layer)及地图图层(MapLayer)(转)

    [Silverlight]Bing Maps学习系列(四):使用图钉层(Pushpin layer)及地图图层(MapLayer) 如果我们需要在Bing Maps中加入一个小图钉标记,该如何实现了? ...

  6. 35. extjs MessageBox里fn:是什么意思

    function的缩写,用来指定回调函数,就是你点击确定或取消按钮之类的按钮以后触发的事件Ext.Msg.show({ title:'自定义消息框', msg:'这是一个自定义消息框,想怎么搞就怎么搞 ...

  7. HTML5牛刀小试

    第一周的HTML5苦逼之路,就这么简单,充实,忙碌的开始了,丝毫不敢有一丢丢懈怠,压力是有的,但更多的是对自己的信心,更是对自己的踏上苦逼之路的意志的肯定. 简单回顾了下这周所学内容.从认识HTML基 ...

  8. SpringBoot整合SpringSecurity简单案例

    在我们开发项目的过程中经常会用到一些权限管理框架,Java领域里边经常用的可能就是shiro了,与之对应的还有SpringSecurity,SpringSecurity可以说是非常强大,与Spring ...

  9. Android 性能优化(1)性能工具之「 lint 」 :Improving Your Code with lint:优化代码

    Improving Your Code with lint 1.See Also lint (reference) Using Android Annotations In addition to t ...

  10. PHP 操作数据库乱码 以及调试

    mysql> show create database pxscj;+----------+--------------------------------------------------- ...