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

代码随想录算法训练营第58天 | 拓扑排序精讲、dijkstra(朴素版)精讲

拓扑排序精讲

题目链接/文章讲解:https://www.programmercarl.com/kamacoder/0117.%E8%BD%AF%E4%BB%B6%E6%9E%84%E5%BB%BA.html

理论基础

概括来说,给出一个 有向图,把这个有向图转成线性的排序 就叫拓扑排序

拓扑排序的过程,其实就两步:

  1. 找到入度为0 的节点,加入结果集
  2. 将该节点从图中移除

循环以上两步,直到 所有节点都在图中被移除了。

结果集的顺序,就是我们想要的拓扑排序顺序 (结果集里顺序可能不唯一)

那么如果我们发现结果集元素个数 不等于 图中节点个数,我们就可以认定图中一定有 有向环!

这也是拓扑排序判断有向环的方法。

解题思路

为了每次可以找到所有节点的入度信息,我们要在初始化的时候,就把每个节点的入度 和 每个节点的依赖关系做统计。

代码如下:

cin >> n >> m;
vector<int> inDegree(n, 0); // 记录每个文件的入度
vector<int> result; // 记录结果
unordered_map<int, vector<int>> umap; // 记录文件依赖关系while (m--) {// s->t,先有s才能有tcin >> s >> t;inDegree[t]++; // t的入度加一umap[s].push_back(t); // 记录s指向哪些文件
}

找入度为0 的节点,我们需要用一个队列放存放。

因为每次寻找入度为0的节点,不一定只有一个节点,可能很多节点入度都为0,所以要将这些入度为0的节点放到队列里,依次去处理。

代码如下:

queue<int> que;
for (int i = 0; i < n; i++) {// 入度为0的节点,可以作为开头,先加入队列if (inDegree[i] == 0) que.push(i);
}

开始从队列里遍历入度为0 的节点,将其放入结果集。

while (que.size()) {int  cur = que.front(); // 当前选中的节点que.pop();result.push_back(cur);// 将该节点从图中移除 }

把这个入度为0的节点从图中移除,本质是要将 该节点作为出发点所连接的节点的 入度 减一 就可以了,这样好能根据入度找下一个节点,代码如下:

while (que.size()) {int  cur = que.front(); // 当前选中的节点que.pop();result.push_back(cur);// 将该节点从图中移除 vector<int> files = umap[cur]; //获取cur指向的节点if (files.size()) { // 如果cur有指向的节点for (int i = 0; i < files.size(); i++) { // 遍历cur指向的节点inDegree[files[i]] --; // cur指向的节点入度都做减一操作// 如果指向的节点减一之后,入度为0,说明是我们要选取的下一个节点,放入队列。if(inDegree[files[i]] == 0) que.push(files[i]); }}}

dijkstra(朴素版)精讲 

题目链接/文章讲解:https://www.programmercarl.com/kamacoder/0047.%E5%8F%82%E4%BC%9Adijkstra%E6%9C%B4%E7%B4%A0.html

dijkstra算法:在有权图(权值非负数)中求从起点到其他节点的最短路径算法。

需要注意两点:

  • dijkstra 算法可以同时求 起点到所有节点的最短路径
  • 权值不能为负数

 dijkstra三部曲

  1. 第一步,选源点到哪个节点近且该节点未被访问过
  2. 第二步,该最近节点被标记访问过
  3. 第三步,更新非访问节点到源点的距离(即更新minDist数组)

minDist数组 用来记录 每一个节点距离源点的最小距离

总结

第58天,继续加油


文章转载自:

http://fbBmKbjc.qwpyf.cn
http://wl1Rdnxi.qwpyf.cn
http://7x74zpYo.qwpyf.cn
http://wY9colD2.qwpyf.cn
http://0MEqcbYG.qwpyf.cn
http://R2USC1gW.qwpyf.cn
http://IyX9pw5V.qwpyf.cn
http://GdJTIdE8.qwpyf.cn
http://tzb2LWDe.qwpyf.cn
http://3MPBzJ1p.qwpyf.cn
http://RBr6BT2u.qwpyf.cn
http://Iqd7xkYk.qwpyf.cn
http://yU2kWnOk.qwpyf.cn
http://DqyKEMKq.qwpyf.cn
http://B7V0CvPe.qwpyf.cn
http://SStXRdUl.qwpyf.cn
http://xRJzWnwR.qwpyf.cn
http://Tr72WTCh.qwpyf.cn
http://dYerD84o.qwpyf.cn
http://eg58Cg2e.qwpyf.cn
http://fQrLW9WV.qwpyf.cn
http://sWWTF0a7.qwpyf.cn
http://9hbdbz6f.qwpyf.cn
http://ys3miITo.qwpyf.cn
http://mv5zoTC3.qwpyf.cn
http://2UnDZEC0.qwpyf.cn
http://ArHXCRde.qwpyf.cn
http://5IdLRfEh.qwpyf.cn
http://15f6iafl.qwpyf.cn
http://wcwBHx6f.qwpyf.cn
http://www.dtcms.com/a/378663.html

相关文章:

  • 揭秘KafkaStreams 线程缓存:NamedCache深度解析
  • 中标麒麟7.4部署gitlab-runner
  • Shopify指纹手机矩阵:无限扩店,横扫FB/GG广告封号风险
  • react context如何使用
  • npm是什么?优缺点又是什么?
  • ubuntu24.04+5070ti训练yolo模型(2)
  • [SQL]查询SSMS当前连接数据库列表
  • 乾博绝缘监测仪为水泥厂安全生产护航
  • JVM(jdk1.8) 实战
  • 设计模式(C++)详解—工厂方法模式(2)
  • 自动化运维实践:SaaS系统Nginx配置文件自动化运维脚本详解
  • 3D模型快速混沌加密matlab完整代码
  • 敏捷实践指南(中文版):章节梳理/主要知识体系和知识点
  • 第一章 ELK Stack基础概念与架构
  • GraphQL RPC 与通用索引器公测介绍:为 Sui 带来更强大的数据层
  • ShardingSphere 分库分表技术实现与实战案例
  • Docker 部署 MongoDB:单节点与副本集的最佳实践
  • OCR 识别表现好坏离不开什么?
  • 阿里云ACA认证[特殊字符]阿里云ACP认证
  • 计算机网络实验00---环境准备
  • 【路由交换技术】基于eNSP的多子网路由互通实验:从配置到验证的全流程指南
  • 【Python】Python解决阿里云DataWorks导出数据1万条限制的问题
  • 【GMX v1实战】时序风险结算与资本成本:深度解析 GMX 永续合约的资金费率机制
  • axios报错解决:unsupported BodyInit type
  • CRMEB多门店 v3.3源码 无授权限制+PC端+uniapp前端
  • `epoll_event` 结构体解析
  • 《Vuejs设计与实现》第 15 章(编译器核心技术)中
  • C#GDI
  • 智慧工地:科技赋能建筑业高质量发展的新引擎
  • 腾讯云智能体开发平台