手写堆优化dijkstra
\(dijkstra\) 算法的堆优化,时间复杂度为\(O(n+m)\log n\)
添加数组\(id[]\)记录某节点在堆中的位置,可以避免重复入堆从而减小常数
而这一方法需要依托手写堆
#include"cstdio"
#include"cstring"
#include"iostream"
#include"algorithm"
#include"bitset"
using namespace std;
const int MAXN=1e5+5;
const int INF=2e9;
int n,m,s,np;
int hp[MAXN],h[MAXN],ln[MAXN],id[MAXN];
struct rpg{
int li,nx,ln;
}a[MAXN<<1];
inline int read()
{
int x=0;char ch=getchar();
while(ch<'0'||'9'<ch) ch=getchar();
while('0'<=ch&&ch<='9') x=(x<<3)+(x<<1)+(ch^'0'),ch=getchar();
return x;
}
inline void add(int ls,int nx,int ln){a[++np]=(rpg){h[ls],nx,ln};h[ls]=np;}
void up(int x)
{
for(int i=x,j=x>>1;j;i=j,j>>=1){
if(ln[hp[i]]<ln[hp[j]]) swap(hp[i],hp[j]),swap(id[hp[i]],id[hp[j]]);
else break;
}return;
}
void ins(int x){hp[++hp[0]]=x;id[x]=hp[0];up(hp[0]);}
void pop()
{
id[hp[1]]=0;id[hp[hp[0]]]=1;
hp[1]=hp[hp[0]--];
for(int i=1,j=2;j<=hp[0];i=j,j<<=1){
if(ln[hp[j+1]]<ln[hp[j]]) ++j;
if(ln[hp[i]]>ln[hp[j]]) swap(hp[i],hp[j]),swap(id[hp[i]],id[hp[j]]);
else break;
}return;
}
void dijkstra()
{
for(int i=1;i<=n;++i) ln[i]=INF;
ln[s]=0;ins(s);
while(hp[0]){
int nw=hp[1];pop();
for(int i=h[nw];i;i=a[i].li){
if(ln[a[i].nx]>ln[nw]+a[i].ln){
ln[a[i].nx]=ln[nw]+a[i].ln;
if(!id[a[i].nx]) ins(a[i].nx);
else up(id[a[i].nx]);
}
}
}return;
}
int main()
{
n=read(),m=read(),s=read();
for(int i=1;i<=m;++i){
int x=read(),y=read(),z=read();
add(x,y,z);
}dijkstra();
for(int i=1;i<=n;++i) printf("%d ",ln[i]);
return 0;
}
手写堆优化dijkstra的更多相关文章
- 手写堆的dijkstra
颓废.. #include <cstdio> #include <cstring> #include <algorithm> using namespace std ...
- POJ 3635 - Full Tank? - [最短路变形][手写二叉堆优化Dijkstra][配对堆优化Dijkstra]
题目链接:http://poj.org/problem?id=3635 题意题解等均参考:POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]. 一些口胡: ...
- BZOJ 3040 最短路 (堆优化dijkstra)
这题不是裸的最短路么?但是一看数据范围就傻了.点数10^6,边数10^7.这个spfa就别想了(本来spfa就是相当不靠谱的玩意),看来是要用堆优化dijkstra了.但是,平时写dijkstra时为 ...
- 堆优化Dijkstra算法
但是,我们会发现刚刚讲的朴素Dijkstra算法(高情商:朴素 : 低情商: 低效)的套路不适用于稀疏图,很容易会爆时间: 所以,我们要对其中的一些操作进行优化,首先我们发现找到里起始点最近的点去更新 ...
- BZOJ5415[Noi2018]归程——kruskal重构树+倍增+堆优化dijkstra
题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 n 个节点.m 条边的无向连通图(节点的编号从 1 至 n).我们依次用 l,a 描述一条边的长度.海 ...
- spfa+剪枝 或者 dij+手写堆+剪枝 UOJ 111
http://uoj.ac/problem/111 好像NOIP里面的题目...有好多都是...能通过xjbg剪枝来...AC题目的? 得好好学一下这些剪枝黑科技了... 思路:我觉得这位大佬说的很完 ...
- 【bzoj2259】[Oibh]新型计算机 堆优化Dijkstra
题目描述 Tim正在摆弄着他设计的“计算机”,他认为这台计算机原理很独特,因此利用它可以解决许多难题. 但是,有一个难题他却解决不了,是这台计算机的输入问题.新型计算机的输入也很独特,假设输入序列中有 ...
- 堆优化dijkstra
单源最短路径 题目链接:https://www.luogu.org/problemnew/show/P4779 直到做了这个题才发现我之前写的堆优化dijkstra一直是错的.. 这个堆优化其实很容易 ...
- 单源最短路问题--朴素Dijkstra & 堆优化Dijkstra
许久没有写博客,更新一下~ Dijkstra两种典型写法 1. 朴素Dijkstra 时间复杂度O(N^2) 适用:稠密图(点较少,分布密集) #include <cstdi ...
随机推荐
- 空行会影响 Java 编译吗?
简评:往往越简单的问题越容易被人们忽略. 问题 这个月的 Stack Overflow 有篇热门文章是国外有位开发者提出: 当我仅仅对 Java 类增加了一行空行,为什么编译后得到了两个不同的字节码文 ...
- webpack+vue中安装使用vue-layer弹窗插件
1.安装vue-layer插件 npm install vue-layer --save-dev 2.打包入口文件main.js中引入vue.vue-layer.并且将vue-layer添加到vue原 ...
- spark持久化
spark持久化:cache .persist.checkpoint 一.cache持久化 cache实际上是persist的一种简化方式,是一种懒执行的,执行action类算子才会触发,cahce后 ...
- Ubuntu 16.04防火墙
防火墙(ufw) 说明:简单版本的防火墙,底层依赖于iptables. 安装:sudo apt-get install ufw 查看状态:sudo ufw status 开启/关闭:sudo ufw ...
- P4177 [CEOI2008]order
传送门 答案等于总工作价值减去最小失去的价值 考虑构建最小割模型 在 $S$割 的点表示选,在 $T$割 的点表示不选 对于机器(编号从 $n+1$ 到 $n+m$) $n+i$,连边 $(n+i,T ...
- 二、利用继承修改OPENERP 的一个模块
问题记录1: No modules named 'xx' 原因: __init__.py 文件命名错误! 问题记录2: XMLSyntaxError: Attribute name redefined ...
- Mac 10.12安装Homebrew图形化界面管理工具Cakebrew
下载: (链接: https://pan.baidu.com/s/1mivJ9H2 密码: f8dr)
- ADO.NET中DbConnection.GetSchema方法的使用总结
此方法获取数据库的结构,所以可以用它获取数据库中所有的表 先上代码 string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;U ...
- 【开源组件】FastDFS极速入门与安装
FastDFS是一个开源的轻量级的分布式文件系统,为互联网量身定制,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供 ...
- PHP之string之wordwrap()函数使用
wordwrap (PHP 4 >= 4.0.2, PHP 5, PHP 7) wordwrap - Wraps a string to a given number of characters ...