代码随想录算法训练营第58天| 图论 拓扑排序 dijkstra算法

news/2024/9/15 5:05:42/ 标签: 算法, 图论, 数据结构

拓扑排序:

听起来是排序实际上是图论问题。对于一个有向图,把这个有向图转化成线性的排序,就叫拓扑排序。实际上是按先后顺序输出需要处理的事件。 实现拓扑排序有两种方法,一种是BFS,另一种是DFS。如果要使用BFS,可以先通过入度为0判断起点是哪个点,只要遍历一遍所有边计算所有点的入度就可以找到起点了。在将该节点加入结果集之后删除,继续寻找集合中入度为0的点加入结果集然后再删除,所以如果出现多个入度为零的点,随便选一个加入结果集就可以,因此拓扑排序结果可以不唯一。

卡码网:117.软件构件

题目链接:117. 软件构建

思路:通过遍历关系计算每个事件的入度。找到入度为零的事件,建立队列,把这个事件入队,寻找所有关系中以这个事件为前提的事件,将他们的入度-1,如果入度==0,那么这个事件入队,把这个事件为前提的关系遍历完之后,这个事件出队。剩下队列内的元素按相同逻辑处理,最后按出队顺序输出的事件就是需要的排序。

代码:

#include<iostream>
using namespace std;
#include<vector>
#include<queue>
#include<unordered_map>int main(){int m,n,s,t;cin>>n>>m;vector<int> inDegree(n,0);//记录每个文件的入度unordered_map<int, vector<int>> umap;//记录文件的依赖关系vector<int> result;for(int i=0;i<m;i++){cin>>s>>t;//s->t 先有s才能有tinDegree[t]++;//所以加的是t的入度umap[s].push_back(t);//s可能不止指向一个事件}queue<int> que;//用来存放入度为0的事件的队列for(int i=0;i<n;i++){//入度为0的事件加入队列if(inDegree[i]==0) que.push(i);}while(!que.empty()){int cur = que.front();que.pop();result.push_back(cur);vector<int> files = umap[cur];//获取这个事件指向的事件for(int i=0;i<(int)files.size();i++){inDegree[files[i]]--;//去掉起始点之后这些点的入度-1if(inDegree[files[i]]==0) que.push(files[i]);//把操作之后入度为0的点进入队列}}if (result.size() == n) {for (int i = 0; i < n - 1; i++) cout << result[i] << " ";cout << result[n - 1];} else cout << -1 << endl;return 0;
}

dijkstra算法:

也是求最短路径的经典算法。和prim算法求最小生成树接近。首先找到距离源点最近的点加入结果集,然后更新加入之后其他点到达源点的最短距离。dijkstra三部曲:1.选源点到哪个节点近而且该节点未被访问过;2.将该节点标记为访问过;3.更新非访问节点到源点的距离。

卡码网:47. 参加科学大会(第六期模拟笔试)

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

代码:

#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;//分别是起点和终点的下标vector<int> minDist(n+1,INT_MAX);//从源点到某个点的最短距离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 j=1;j<=n;j++){if(!visited[j]&&minDist[j]<minVal){//出现更小的距离则替换minVal=minDist[j];cur=j;}}visited[cur]=true;//将该节点标记为truefor(int j=1;j<=n;j++){if(!visited[j]&&grid[cur][j]!=INT_MAX&&minDist[cur]+grid[cur][j]<minDist[j]){minDist[j]=minDist[cur]+grid[cur][j];}}}if(minDist[end]==INT_MAX) cout<<-1;else cout<<minDist[end];return  0;
}


http://www.ppmy.cn/news/1518627.html

相关文章

.net开发日常笔记(持续更新)

List<T>.Sort() → 排序T List<T>.Find() → 找出一個T List<T>.FindAll() →找出多個T List<T>.Exist() →判斷T是否存在 ----------------------END--------------------------- 提示确定&#xff0c;例如删除等 //提示是否提交if (MessageBox.…

游戏引擎详解——图片

图片 图片的格式 图片文件格式pngjpg 纹理压缩格式ETC1/2PVRTCASTC 图片的属性 图片属性解释分辨率宽高像素值&#xff08;pt&#xff09;&#xff0c;如&#xff1a;1024*1024位深度用来存储像素颜色的值&#xff0c;如RGBA8888&#xff0c;红黄蓝透明度4个维度每个8bit&…

docker简单私有仓库的搭建

示例&#xff1a; 【搭建简单的Registry仓库】 1. 下载 Registry 镜像 [rootdocker ~]# docker pull registry #可以查看开放的端口&#xff0c;需要把端口暴露出来 [rootdocker ~]# docker history registry:latest [rootdocker ~]# docker run -d -p 5000:5000 --restartal…

【多线程】设计模式之单例模式

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;多线程 / javaEE初阶 一、什么是设计模式 设计模式好⽐象棋中的 "棋谱". 红⽅当头炮, ⿊⽅⻢来跳. 针对红⽅的⼀些⾛法, ⿊⽅应招的时候有⼀些固定的套路. 按照套路来⾛局势就不会吃亏. …

记录|如何全局监听鼠标和键盘等事件

目录 前言一、MyMessager类二、Form中进行Timer监听更新时间 前言 参考文章&#xff1a; C# winfrom 长时间检查不到操作&#xff0c;自动关闭应用程序 本来是想&#xff0c;如果一段时间没有操作软件&#xff0c;这个软件就自动退出的任务。但是在C#中&#xff0c;采用winform…

Google Earth Engine:对NDVI进行惠特克平滑算法进行长时序分析

目录 简介 函数 ee.Array.identity(size) Arguments: Returns: Array transpose(axis1, axis2) Arguments: Returns: Array matrixMultiply(image2) Arguments: Returns: Image matrixSolve(image2) Arguments: Returns: Image arrayFlatten(coordinateLabels, …

Qt应用的高分辨率适配

背景 工作中需要面对触控大屏的4K分辨率场景&#xff0c;同时也有越来越多人开始使用高分屏&#xff0c;原来多基于1080p分辨率开发的Qt程序无法很好适配更高的分辨率。 没有特意针对高分辨率场景做适配时&#xff0c;Qt应用的表现通常有两种情况&#xff1a; 分辨率高的情况…

波导阵列天线单元学习笔记7 一种用直接金属激光烧结考虑的轻质量,宽带,双圆极化波导腔体阵列

摘要&#xff1a; 提出了一种工作在Ku频段的轻质量&#xff0c;宽带&#xff0c;双圆极化波导腔体阵列。为了获得双正交的线极化&#xff0c;基本的辐射单元是由两个波导馈电的方形腔体。通过恰当地对馈网进行调谐&#xff0c;可以获得对于两个正交极化的等辐同相辐射电场&…

智能指针(RAII)

智能指针&#xff08;RAII&#xff09; 一、内存泄漏1、介绍2、原因3、泄漏的内存类型分类 二、RAII1、介绍2、基本思想3、优点4、实现方式 三、unique_ptr1、介绍2、主要特性3、注意事项4、unique_ptr类5、示例代码6、运行结果7、简单实现 四、shared_ptr1、介绍2、主要特点3、…

如何处理时间序列异常值?理解、检测和替换时间序列中的异常值

异常值的类型 (欢迎来到雲闪世界) 异常值是与正常行为有显著偏差的观察结果。 时间序列可能会因某些异常和非重复事件而出现异常值。这些异常值会影响时间序列分析&#xff0c;并误导从业者得出错误的结论或有缺陷的预测。因此&#xff0c;识别和处理异常值是确保时间序列建模…

【TDesign】如何修改CSS变量

Tdesign的组件想通过style定义样式没效果, 可以通过组件api文档修改, 组件提供了下列 CSS 变量&#xff0c;可用于自定义样式。 比如Cell, https://tdesign.tencent.com/miniprogram/components/cell?tabapi 提供了&#xff1a; –td-cell-left-icon-color 图标颜色 –td-cell…

【Leetcode 2341 】 数组能形成多少数对 —— 去重

给你一个下标从 0 开始的整数数组 nums 。在一步操作中&#xff0c;你可以执行以下步骤&#xff1a; 从 nums 选出 两个 相等的 整数从 nums 中移除这两个整数&#xff0c;形成一个 数对 请你在 nums 上多次执行此操作直到无法继续执行。 返回一个下标从 0 开始、长度为 2 的…

电脑变声器软件哪个好用?最新款实时变声器数据公开!

电脑变声器软件哪个好用&#xff1f;什么场合下需要用到变声器&#xff1f;在派对或朋友聚会中&#xff0c;使用变声器可以模仿各种动物、名人或虚构角色的声音&#xff1b;直播变声搞怪&#xff1b;匿名游戏聊天&#xff1b;电影、动画、电视音效、旁白制作等等&#xff0c;都…

高职院校大数据分析与可视化微服务架构实训室解决方案

一、前言 随着信息技术的飞速发展&#xff0c;大数据已成为推动社会进步与产业升级的关键力量。为了培养适应未来市场需求的高素质技术技能型人才&#xff0c;高职院校纷纷加大对大数据分析与可视化技术的教学投入。唯众&#xff0c;作为国内领先的职业教育解决方案提供商&…

2 Python开发工具:PyCharm的安装和使用

本文是 Python 系列教程第 2 篇&#xff0c;完整系列请查看 Python 专栏。 1 安装 官网下载地址https://www.jetbrains.com.cn/pycharm/&#xff0c;文件比较大&#xff08;约861MB&#xff09;请耐心等待 双击exe安装 安装成功后会有一个30天的试用期。。。本来想放鸡火教程&…

Nginx负载均衡请求队列配置:优化流量管理

在高流量的Web应用场景中&#xff0c;合理地管理进入的请求流量对于保持服务的稳定性和响应性至关重要。Nginx提供了请求队列的配置选项&#xff0c;允许开发者控制进入后端服务器的请求数量。通过配置请求队列&#xff0c;可以在后端服务器达到最大处理能力时&#xff0c;优雅…

005、架构_数据节点

​DN组件总览 ​ DN节点包含进程 dbagent进程:主要提供数据节点高可用、数据导入导出、数据备份恢复、事务一致性、运维类功能、集群的扩缩容、卸数等功能;MySQL进程:主要提供数据一致性、分组管理、快同步复制、高低水位等;

测试岗位应该学什么

以下是测试岗位需要学习的一些关键内容&#xff1a; 1. 测试理论和方法 - 了解不同类型的测试&#xff0c;如功能测试、性能测试、压力测试、安全测试、兼容性测试等。 - 掌握测试策略和测试计划的制定。 2. 编程语言 - 至少熟悉一种编程语言&#xff0c;如 Python、Java…

网络路由介绍,route指令,查询路由表的过程,默认路由

目录 路由 本地主机的路由功能 引入 route指令 查询路由表的过程 介绍 示例 默认路由 注意 路由 本地主机的路由功能 引入 报文经过多个路由器转发至公网,再从公网定位后转发至私网,最终到达目标主机 而报文肯定是要先经过本地主机的 所以本地主机也具有路由功能,也…

django网吧收费管理系统 项目源码26819

摘 要 随着互联网的普及&#xff0c;网吧作为公共互联网接入场所&#xff0c;依旧在许多地区发挥着重要作用。现代网吧不仅仅是提供上网服务的场所&#xff0c;还包括了游戏、社交、休闲等多功能体验。为了提高网吧的服务质量和运营效率&#xff0c;迫切需要一个高效的管理系统…