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

图论篇--代码随想录算法训练营第五十八天打卡|拓扑排序,dijkstra(朴素版),dijkstra(堆优化版)精讲

拓扑排序

题目链接:117. 软件构建

题目描述:

某个大型软件项目的构建系统拥有 N 个文件,文件编号从 0 到 N - 1,在这些文件中,某些文件依赖于其他文件的内容,这意味着如果文件 A 依赖于文件 B,则必须在处理文件 A 之前处理文件 B (0 <= A, B <= N - 1)。请编写一个算法,用于确定文件处理的顺序。

算法思路:

拓扑排序:给出一个 有向图,把这个有向图转成线性的排序 

拓扑排序的过程:

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

代码:

#include <iostream>
#include <vector>
#include <queue>
#include <unordered_map>
using namespace std;
int main() {int m, n, s, t;cin >> n >> m;vector<int> inDegree(n, 0); // 记录每个文件的入度unordered_map<int, vector<int>> umap;// 记录文件依赖关系vector<int> result; // 记录结果while (m--) {// s->t,先有s才能有tcin >> s >> t;inDegree[t]++; // t的入度加一umap[s].push_back(t); // 记录s指向哪些文件}queue<int> que;for (int i = 0; i < n; i++) {// 入度为0的文件,可以作为开头,先加入队列if (inDegree[i] == 0) que.push(i);//cout << inDegree[i] << endl;}// int count = 0;while (que.size()) {int  cur = que.front(); // 当前选中的文件que.pop();//count++;result.push_back(cur);vector<int> files = umap[cur]; //获取该文件指向的文件if (files.size()) { // cur有后续文件for (int i = 0; i < files.size(); i++) {inDegree[files[i]] --; // cur的指向的文件入度-1if(inDegree[files[i]] == 0) que.push(files[i]);}}}if (result.size() == n) {for (int i = 0; i < n - 1; i++) cout << result[i] << " ";cout << result[n - 1];} else cout << -1 << endl;}

dijkstra(朴素版)

题目链接:47. 参加科学大会(第六期模拟笔试)

题目描述:

小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。

小明的起点是第一个车站,终点是最后一个车站。然而,途中的各个车站之间的道路状况、交通拥堵程度以及可能的自然因素(如天气变化)等不同,这些因素都会影响每条路径的通行时间。

小明希望能选择一条花费时间最少的路线,以确保他能够尽快到达目的地。

算法思路:

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

需要注意两点:

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

dijkstra三部曲

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

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

代码:

#include <iostream>
#include <vector>
#include <climits>
using namespace std;
int main() {int n, m, p1, p2, val;cin >> n >> m;vector<vector<int>> grid(n + 1, vector<int>(n + 1, INT_MAX));for(int i = 0; i < m; i++){cin >> p1 >> p2 >> val;grid[p1][p2] = val;}int start = 1;int end = n;// 存储从源点到每个节点的最短距离std::vector<int> minDist(n + 1, INT_MAX);// 记录顶点是否被访问过std::vector<bool> visited(n + 1, false);minDist[start] = 0;  // 起始点到自身的距离为0for (int i = 1; i <= n; i++) { // 遍历所有节点int minVal = INT_MAX;int cur = 1;// 1、选距离源点最近且未访问过的节点for (int v = 1; v <= n; ++v) {if (!visited[v] && minDist[v] < minVal) {minVal = minDist[v];cur = v;}}visited[cur] = true;  // 2、标记该节点已被访问// 3、第三步,更新非访问节点到源点的距离(即更新minDist数组)for (int v = 1; v <= n; v++) {if (!visited[v] && grid[cur][v] != INT_MAX && minDist[cur] + grid[cur][v] < minDist[v]) {minDist[v] = minDist[cur] + grid[cur][v];}}}if (minDist[end] == INT_MAX) cout << -1 << endl; // 不能到达终点else cout << minDist[end] << endl; // 到达终点最短路径}

dijkstra(堆优化版)精讲

算法思路: 

朴素版考虑点,堆优化版考虑边(类似于prim和kruskal算法)

1、使用邻接表存图信息<节点,权值>

2、dijkstra 三部曲:

  1. 第一步,选源点到哪个节点近且该节点未被访问过-->使用一个 小顶堆 来帮我们对边的权值排序,每次从小顶堆堆顶 取边就是权值最小的边。
  2. 第二步,该最近节点被标记访问过。-->同朴素版
  3. 第三步,更新非访问节点到源点的距离(即更新minDist数组)-->遍历该节点在邻接表中所指向的一系列节点,若之前为访问过,则入堆。

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 洛谷9.16
  • 【C++】入门基础(下)
  • Java 流 (Stream) 详解
  • 电气自动化入门01:电工基础
  • 整型提升整型提升练习题
  • 用于稀疏自适应深度细化的掩码空间传播网络 CVPR2024
  • 前端基础知识+算法(一)
  • Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 死亡对象判断方法
  • pytorch快速入门(一)—— 基本工具及平台介绍
  • WebGL系列教程八(GLSL着色器基础语法)
  • 采用qt做一个命令行终端
  • 面向对象程序设计之继承(C++)
  • ai 回答HFS是什么 HTTP的文件服务器是什么
  • Leetcode3282. 到达数组末尾的最大得分
  • new/delete和malloc/free到底有什么区别
  • [Vue CLI 3] 配置解析之 css.extract
  • 【剑指offer】让抽象问题具体化
  • 【知识碎片】第三方登录弹窗效果
  • 30天自制操作系统-2
  • CentOS 7 修改主机名
  • Django 博客开发教程 8 - 博客文章详情页
  • HTML5新特性总结
  • linux安装openssl、swoole等扩展的具体步骤
  • Octave 入门
  • PHP的类修饰符与访问修饰符
  • 程序员最讨厌的9句话,你可有补充?
  • 精彩代码 vue.js
  • 区块链技术特点之去中心化特性
  • 日剧·日综资源集合(建议收藏)
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 数据科学 第 3 章 11 字符串处理
  • 原生 js 实现移动端 Touch 滑动反弹
  • 找一份好的前端工作,起点很重要
  • ​浅谈 Linux 中的 core dump 分析方法
  • #QT(智能家居界面-界面切换)
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (AngularJS)Angular 控制器之间通信初探
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (zhuan) 一些RL的文献(及笔记)
  • (二) 初入MySQL 【数据库管理】
  • (六)Hibernate的二级缓存
  • (三分钟)速览传统边缘检测算子
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (十一)手动添加用户和文件的特殊权限
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • (转)iOS字体
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • ***监测系统的构建(chkrootkit )
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .net mvc 获取url中controller和action
  • .net专家(张羿专栏)
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • @RequestBody与@ModelAttribute