当前位置: 首页 > news >正文

算法笔记 图论和优先级队列的笔记

图论

DFS       stack     O(h)     不具有最短性

BFS       queue    O(2^h)   最短路

迪杰斯特拉算法 Dijkstra算法

  • 初始化

    • 将起始节点 A 的距离设为 0
    • 将其他所有节点的距离设为无穷大。
    • 创建一个优先队列,并将起始节点 A 加入优先队列。
  • 处理队列

    • 从优先队列中取出距离最小的节点 u
    • 对于 u 的每个邻接节点 v,计算从 uv 的路径长度,如果该长度小于当前记录的 v 的最短路径,则更新 v 的最短路径并将 v 加入优先队列。

Floyd多元最短路  O(n^3)

for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)d[i][j]=min(d[i][j],d[i][k]+d[k][j]);

拓扑排序的算法步骤

建图邻接列表

  • 计算每个节点的入度

    • 对于每一个节点,计算它有多少条边指向它,并记录这些入度。
  • 找到所有入度为 0 的节点并将它们放入队列

    • 初始化一个队列,将所有入度为 0 的节点入队。
  • 处理队列中的节点

    • 从队列中取出一个节点,将它添加到拓扑排序结果中。
    • 对这个节点的每一个邻接节点,减少它们的入度(因为这个节点已经被移除)。
    • 如果某个邻接节点的入度变为 0,则将该节点入队。
  • 重复步骤 3,直到队列为空

    • 如果所有节点都被处理,则成功地得到了一个拓扑排序。
    • 如果还有节点未被处理且队列为空,说明图中存在环,无法进行拓扑排序。

二分图 

        当且仅当图中没有奇数环

优先级队列

lambda函数中 >是最小堆, <是最大堆

greater是最小堆,less是最大堆

  • 最大堆:默认情况下,priority_queue 是最大堆,因为它使用 < 比较函数。这意味着较大的元素具有较高的优先级。
  • 最小堆:通过使用 greater<> 比较函数,priority_queue 变成了最小堆。greater<> 确保较小的元素具有较高的优先级。
  • 自定义比较函数:使用 lambda 表达式或其他自定义比较函数,可以灵活地定义优先级规则。

auto tupleCmp =[](const auto& e1,const auto& e2){ auto&& [x1,y1,d1]=e1; auto&& [x2,y2,d2]=e2; return d1>d2; };这个是最大堆还是最小堆

堆顶是优先级最高(值最大)的元素。

  1. 捕获参数
    • const auto& e1const auto& e2:这两个参数是要比较的元素,类型自动推断。
  2. 结构化绑定
    • auto&& [x1, y1, d1] = e1;auto&& [x2, y2, d2] = e2;:使用结构化绑定来解包元素。这些元素应该是类似于 tuplepair 的结构,其中 d1d2 是我们要比较的第三个元素(假设它们是优先级或距离)。
  3. 返回比较结果
    • return d1 > d2;:比较 d1d2。如果 d1 大于 d2,则返回 true

priority_queue 中,如果比较函数返回 true,表示 e1 应该排在 e2 之前。默认情况下,priority_queue 是最大堆,即较大的元素优先。然而,在这个自定义比较函数中:

  • d1 > d2 时,e1 被认为优先级更高,排在 e2 前面。
  • 因此,较小的 d 会被认为优先级较低。

结论:

这个比较函数实际上创建了一个 最小堆,因为 priority_queue 会根据 d 的值按升序排列,即优先处理 d 值较小的元素。

相关文章:

  • CSS从入门到精通——动画:CSS3动画执行次数和逆向播放
  • 中间件复习之-分布式存储系统
  • C#防止多次注册事件
  • 学习笔记——网络管理与运维——SNMP(SNMP版本)
  • uniapp如何实现跳转
  • GenICam标准(六)
  • MySQL的三种重要的日志
  • Vue3 和 Vue2 对比分析及示例代码解析(初级)
  • Python **运算符(python**kwargs:参数解包)(kwargs:keyword arguments)
  • 10:Hello, World!的大小
  • 小程序无法调用服务端问题排查
  • uniapp地图自定义文字和图标
  • c++编程(17)——deque的模拟实现(1)迭代器篇
  • vuex是什么?如何使用?使用他的功能场景?
  • [大模型]XVERSE-MoE-A4.2B Transformers 部署调用
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 【刷算法】从上往下打印二叉树
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • angular学习第一篇-----环境搭建
  • bootstrap创建登录注册页面
  • Consul Config 使用Git做版本控制的实现
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • HTTP--网络协议分层,http历史(二)
  • JS笔记四:作用域、变量(函数)提升
  • React组件设计模式(一)
  • Vim Clutch | 面向脚踏板编程……
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • vue中实现单选
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 从setTimeout-setInterval看JS线程
  • 当SetTimeout遇到了字符串
  • 分享一份非常强势的Android面试题
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 微信开放平台全网发布【失败】的几点排查方法
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #考研#计算机文化知识1(局域网及网络互联)
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (003)SlickEdit Unity的补全
  • (4)事件处理——(7)简单事件(Simple events)
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (论文阅读30/100)Convolutional Pose Machines
  • .gitignore文件_Git:.gitignore
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET 读取 JSON格式的数据
  • .net通用权限框架B/S (三)--MODEL层(2)
  • ::什么意思
  • @Autowired和@Resource的区别
  • @property python知乎_Python3基础之:property
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
  • [1525]字符统计2 (哈希)SDUT
  • [20150321]索引空块的问题.txt
  • [2018-01-08] Python强化周的第一天