博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
手写堆优化dijkstra
阅读量:6182 次
发布时间:2019-06-21

本文共 1163 字,大约阅读时间需要 3 分钟。

\(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'
>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 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;}

转载于:https://www.cnblogs.com/AH2002/p/9632705.html

你可能感兴趣的文章
[Java] I/O基础理解
查看>>
Web上的CAD矢量图形
查看>>
使用miniLZO微型压缩库进行压缩和解压缩
查看>>
Java的反射机制
查看>>
对比几段代码,看看你是 Python 菜鸟还是老鸟
查看>>
eclipse常用快捷键
查看>>
基于基线版本新建分支,并合并之前未合并到基线版本的分支
查看>>
百度地图- - - 鹰眼轨迹- - - 地理围栏
查看>>
schematool -dbType derby -initSchema
查看>>
mybatis 3.5.0版本(三)
查看>>
制作用于印刷的服装标签
查看>>
JBoss 系列八十七: JBoss 中 JMS 消息设定 TimeToLive 的一个误解
查看>>
Ruby和面向对象概览
查看>>
Command Patern
查看>>
Spring MVC 异构响应
查看>>
Linux 文件目录
查看>>
Android studio style 提示主题样式找不到
查看>>
Android音频开发(6):使用 OpenSL ES API(上)
查看>>
关闭ESXi https的欢迎页面,增强服务器的安全。
查看>>
获取请求主机IP地址IPUtil
查看>>