嘤嘤嘤今天被迫学了这个算法……其实对于学习图论来说我内心是拒绝的\(\mathscr{qnq}\)

由于发现关于这个\(\mathscr{SPFA}\)的时间复杂度\(O(kE)\)中的\(k \approx 2\)好像只针对于稀疏图?\(emmm\)想不到时间复杂度居然还有数据分治这一说\(ORZ\)

好的,对于我的图论而言,好像只会\(MST\)、\(\mathscr{MT \ \ Law}\)和最短路?哦呵呵呵呵那可真优秀啊\(QAQ\)

要不是今天上午学了堆优化的,没准我连普通的都不会了!


回归正题,最朴素的\(\mathscr{dijkstra}\)的思想是我们要从已知的点里面选一个离源点最近的,然后以此不断松弛周围的点(代码显性),并保存这个点的最短路(代码隐性)。而\(dijkstra\)遵循的是贪心思想,就是在边权都是正的的情况下,当前找到的最短路一定是对于这个点全局最优,因为不会再有更短的路径了——而显然这个贪心在有负权边的时候的错误的。

于是我们发现,对于其中“找到最近的点”,即当前记录的\(dist_i\)最小的\(i\),是有优化性可言的。朴素是\(O(n)\)的查询,加上堆之后就可以变成\(O(logn)\)。所以原本时间复杂度\(O(mn)\)的\(dijkstra\)就可以优化成\(O(mlogn)\),并且相对稳定。

于是核心的代码就是这一部分啦~

inline void dijistra(){
fill(dist + 1, dist + N + 1, 2147483647) ;
q.push((node){S, 0}) ; dist[S] = 0 ;
while(!q.empty()){
node qwq = q.top() ; q.pop() ;
x1 = qwq.t, x2 = qwq.v ;
if(vis[x1]) continue ; vis[x1] = 1 ;
for(k = head[x1]; k ; k = e[k].next){
dist[e[k].to] = min(dist[e[k].to], x2 + e[k].v) ;
q.push((node){e[k].to, dist[e[k].to]}) ;
}
}

\(qwq\)就这样了

学习笔记·堆优化$\mathscr{dijkstra}$的更多相关文章

  1. C语言学习笔记——堆和栈——未整理

    C语言笔记     栈区     栈stack是一种先进后出的内存结构,所有的自动变量,函数的形参都是由编译器自动放出栈中,当一个自动变量超出其作用域时,自动从栈中弹出.出入栈是由C语言编译器自动分配 ...

  2. Java学习笔记--堆、栈、常量池

    参考资料:http://blog.csdn.net/miraclestar/article/details/6039743 Java内存区域模型主要分为4部分 1.方法区 2.本地方法栈 3.栈 4. ...

  3. JVM学习笔记——堆

    堆 Heap 一个 JVM 只有一个堆,堆也是 Java 内存管理的核心区域.在 JVM 启动时堆被创建,同时大小在启动时已设定好,堆是 JVM 管理最大的一块内存空间,其大小可以调节. 堆的内存空间 ...

  4. JS学习笔记12_优化

    一.可维护性优化 1.添加注释 注释能够增强代码的可读性以及可维护性,当然,理想情况是满满的注释,但这不太现实.所以我们只需要在一些关键的地方添上注释: 函数和方法:尤其是返回值,因为直接看不出来 大 ...

  5. 《Java程序性能优化》学习笔记 程序优化

    这一部分主要介绍代码层的优化.了解如何编写高效而精炼的代码,正确的使用函数方法.1.字符串优化处理Java语言中,String对象可以认为是对char数组的眼神和进一步封装.它主要由3部分组成:cha ...

  6. 《Java程序性能优化》学习笔记 设计优化

    豆瓣读书:http://book.douban.com/subject/19969386/ 第一章 Java性能调优概述 1.性能的参考指标 执行时间: CPU时间: 内存分配: 磁盘吞吐量: 网络吞 ...

  7. mysql 学习笔记5-- 数据库优化

    ext4:(rw,noatime,nodiratime,nobarrier,data=ordered)xfs: (rw,noatime,nodiratim,nobarrier,logbufs=8,lo ...

  8. Linux学习笔记 --服务器优化

    Linux服务器优化 序言: 服务器操作建议 1.严格按照目录规范操作服务器 2.远程服务器不允许关机 3.不要在服务器访问高峰运行高负载命令 4.远程配置防火墙时,不要把自己踢出服务器 一.禁用不必 ...

  9. Dynamic CRM 2013学习笔记(七)追踪、监控及性能优化

    本文将介绍CRM的三个内容追踪.监控及性能优化.追踪是CRM里一个很有用的功能,它能为我们的CRM调试或解决错误.警告提供有价值的信息:我们可以用window的性能监控工具来了解CRM的性能状况:最后 ...

随机推荐

  1. C# try catch嵌套

    try catch嵌套之后出现异常执行顺序: static void Main(string[] args) { try { Console.WriteLine("------------- ...

  2. Two ways to invert a string

    package com.itheima_07; import java.util.Scanner; /* * 字符串反转 * 举例:键盘录入”abc” * 输出结果:”cba” * * 分析: * A ...

  3. web前端要学哪些?

    本来是学java还有jsp这些东西的,后来毕业了就去找了个前端的工作:一开始就接触 nodejs+express+Angularjs+mongodb这些东西.不知道学了这些东西做前端够不够用.现在也就 ...

  4. zTree自定义节点name显示样式

    //setting中配置属性 view: { showLine:false, dblClickExpand: true, showIcon: false, addDiyDom: addDiyDom / ...

  5. spring boot(13)-logback和access日志

    logback logback出自log4j的作者,性能和功能相比log4j作出了一些改进,而配置方法和log4j类似,是spring boot的默认日志组件.在application.propert ...

  6. javascript event visualize

    很多时候拿到一个spa,特别是基于jquery的比较复杂的spa时,如果你好奇他是如何工作的,往往没有头绪. 由于spa基本上都是基于事件触发的,一个可行的办法是通过查看事件处理代码能够对spa有一个 ...

  7. 在centos系统安装mongodb

    在Linux CentOS系统上安装完php和MySQL后,为了使用方便,需要将php和mysql命令加到系统命令中,如果在没有添加到环境变量之前,执行“php -v”命令查看当前php版本信息时时, ...

  8. 可以触发点击事件并变色的UILabel

    可以触发点击事件并变色的UILabel 谁说UILabel不能够当做button处理点击事件呢?今天,笔者就像大家提供一个改造过的,能够触发点击事件并变色的UILabel:) 效果图: 还能当做计时器 ...

  9. 使用CAReplicatorLayer [2]

    使用CAReplicatorLayer [2] 工具类 // // Math.h // MathEquation // // Created by YouXianMing on 15/11/20. / ...

  10. python离线安装外部依赖包

     1.制作requirement.txt pip freeze > requirement.txt 内网安装外部依赖包办法: 例如:安装pytest包得时候会顺带安装pytest依赖包 离线下载 ...