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

本文共 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

你可能感兴趣的文章
solr-4.10.4部署到tomcat6
查看>>
切片键(Shard Keys)
查看>>
淘宝API-类目
查看>>
virtualbox 笔记
查看>>
Git 常用命令
查看>>
驰骋工作流引擎三种项目集成开发模式
查看>>
SUSE11修改主机名方法
查看>>
jdk6.0 + Tomcat6.0的简单jsp,Servlet,javabean的调试
查看>>
Android:apk签名
查看>>
2(2).选择排序_冒泡(双向循环链表)
查看>>
MySQL 索引 BST树、B树、B+树、B*树
查看>>
微信支付
查看>>
CodeBlocks中的OpenGL
查看>>
短址(short URL)
查看>>
第十三章 RememberMe——《跟我学Shiro》
查看>>
mysql 时间函数 时间戳转为日期
查看>>
索引失效 ORA-01502
查看>>
Oracle取月份,不带前面的0
查看>>
Linux Network Device Name issue
查看>>
IP地址的划分实例解答
查看>>