代码随想录算法训练营第58天 | 1、软件构建,2、参加科学大会

目录

1、软件构建

2、参加科学大会


1、软件构建

题目描述

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

输入描述

第一行输入两个正整数 N, M。表示 N 个文件之间拥有 M 条依赖关系。

后续 M 行,每行两个正整数 S 和 T,表示 T 文件依赖于 S 文件。

输出描述

输出共一行,如果能处理成功,则输出文件顺序,用空格隔开。 

如果不能成功处理(相互依赖),则输出 -1。

输入示例

5 4
0 1
0 2
1 3
2 4

输出示例

0 1 2 3 4

提示信息

文件依赖关系如下:

所以,文件处理的顺序除了示例中的顺序,还存在

0 2 4 1 3

0 2 1 3 4

等等合法的顺序。

数据范围:

0 <= N <= 10 ^ 5

1 <= M <= 10 ^ 9

每行末尾无空格。

思路:拓扑排序就是将一个有向图拆分出来,形成一个可行的序列。

而拆分的依据与结点间的先后顺序有关,实际应用比如学习课程的先后顺序,做一件事的先后顺序,拓扑图如果能排序,那图中的每个结点所代表的事件一定存在一个先后的逻辑,我们要做的就是将这样的一个顺序找出来。

如果是通过图来找,那其实很容易分辨。对应到具体编码的话需要考虑结点的入度。我们会发现入度为0的点是可以从图中删除,拿出来进行排序的,因为在它之前没有先导事件了,所以需要记录结点的入度。

同时我们要记录结点间的连接情况,使用邻接矩阵在稀疏图中会造成空间的浪费,所以这里我们采用邻接表存储。

我们采用的是广搜的办法,所以需要使用到队列。

同时还需要一个result数组记录排序的结点数,因为如果最后结束时,result中的结点个数不等于n,说明有结点没有办法拿出来排序,这种情况一般就是结点之间存在循环,每个结点入度都不可能为0,所以没有办法拿出来计算。

还需要注意一点,最后输出的时候,注意格式,最后需不需要有空格之类的,以免出错。

#include<iostream>
#include<vector>
#include<list>
#include<queue>
using namespace std;int main(){int n, m;while(cin >> n >> m){vector<int> inDegree(n, 0);//这里需要记录每个结点的入度,从而找到拓扑排序的开始位置,方便排序vector<int> result; //记录最终排序的结点顺序vector<list<int>> grid(n);//使用邻接表来记录每个结点的与其他结点的联系int s, t;//记录输入的结点for(int i = 0; i < m; i ++){cin >> s >> t;inDegree[t] ++;//s->t,所以t的入度要加1grid[s].push_back(t);//使用邻接表记录整张图}queue<int> que;//采用广搜来遍历for(int i = 0; i < n; i ++){if(inDegree[i] == 0) que.push(i);//将入度为0的结点加入队列作为开始结点} while(!que.empty()){int node = que.front(); que.pop();result.push_back(node);list<int> keys = grid[node];//获取该结点所连接的其他结点for(int key : keys){inDegree[key] --;//因为这里将node加入了result中,需要从图中删除node,所以node所连接的各结点入度都需要减1if(inDegree[key] == 0) que.push(key);//如果其他结点入度为0了,说明该结点可以进行排序删除了,所以加入que中}}if(result.size() == n) {//如果说result中的结点个数不等于n,说明拓扑排序失败了,拓扑图中存在环for(int i = 0; i < n - 1; i ++){cout << result[i] << " ";}cout << result[n - 1];}else{cout << -1 << endl;}}
}

2、参加科学大会

题目描述

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

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

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

输入描述

第一行包含两个正整数,第一个正整数 N 表示一共有 N 个公共汽车站,第二个正整数 M 表示有 M 条公路。 

接下来为 M 行,每行包括三个整数,S、E 和 V,代表了从 S 车站可以单向直达 E 车站,并且需要花费 V 单位的时间。

输出描述

输出一个整数,代表小明从起点到终点所花费的最小时间。

输入示例

7 9
1 2 1
1 3 4
2 3 2
2 4 5
3 4 2
4 5 3
2 6 4
5 7 4
6 7 9

输出示例

12

提示信息

能够到达的情况:

如下图所示,起始车站为 1 号车站,终点车站为 7 号车站,绿色路线为最短的路线,路线总长度为 12,则输出 12。

不能到达的情况:

如下图所示,当从起始车站不能到达终点车站时,则输出 -1。

数据范围:

1 <= N <= 500;
1 <= M <= 5000;

思路:求最短路径就涉及到了dijkstra算法了。

其实如果之前的prim算法掌握的话,会发现它们其实很像,主要就是三步,找最小,标记,最后更新。

但是这里的最小是源点到结点的最短距离中的最小,更新的时候也是更新的源点到各结点的最短距离。

整体思路其实并不难理解。

#include<iostream>
#include<vector>
#include<climits>
using namespace std;int main(){int n, m;int v1, v2, val;cin >> n >> m;vector<vector<int>> grid(n + 1, vector<int>(n + 1, 10001));for(int i = 0; i < m; i ++){cin >> v1 >> v2 >> val;grid[v1][v2] = val;}vector<int> minDist(n + 1, 10001);vector<bool> visited(n + 1, false);minDist[1] = 0;for(int i = 1; i <= n; i ++){int cur = 1;int min = INT_MAX;for(int j = 1; j <= n; j ++){//选源点到结点的最短路径if(!visited[j] && minDist[j] < min){min = minDist[j];cur = j;}}visited[cur] = true;//将结点进行标记for(int j = 1; j <= n; j ++){//开始更新源点到其他结点的最短距离if(!visited[j] && minDist[cur] + grid[cur][j] < minDist[j]){minDist[j] = minDist[cur] + grid[cur][j];}}}if(minDist[n] == 10001){cout << -1 << endl;return 0;}cout << minDist[n] << endl;
}

感谢你的阅读,希望我的文章能够给你帮助,如果有帮助,麻烦点赞加收藏,或者点点关注,非常感谢。

如果有什么问题欢迎评论区讨论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1548461.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

测试用例的举例

1. 基于测试公式设计测试用例 通过功能&#xff0c;性能&#xff0c;安全性&#xff0c;界面&#xff0c;安全性&#xff0c;易用&#xff0c;兼容对于一个水杯进行测试用例的设计&#xff1b; 对于一个软件的测试用例设计&#xff1a; 功能&#xff1a;软件本质上能够用来干什…

怎样用云手机进行TikTok矩阵运营?

在运营TikTok矩阵时&#xff0c;许多用户常常面临操作复杂、设备过多等问题。如果你也感到操作繁琐&#xff0c;不妨考虑使用云手机。云手机具备丰富的功能&#xff0c;能够帮助电商卖家快速打造高效的TikTok矩阵。接下来&#xff0c;我们将详细解析这些功能如何提升你的运营效…

【ADC】SAR 型 ADC 和 ΔΣ ADC 的噪声源以及输入信号驱动和电压基准驱动电路

本文学习于TI 高精度实验室课程&#xff0c;简要介绍 SAR 型 ADC 和 ΔΣ ADC 的输入信号驱动和电压基准驱动电路&#xff0c;并介绍 SAR 和 Delta-Sigma 转换器的内在和外在噪声源。 文章目录 一、ADC 的外部噪声1.1 50/60 Hz 工频干扰1.2 混叠与抗混叠滤波器1.3 射频&#xf…

深度学习(入门)03:监督学习

1、监督学习简介 监督学习&#xff08;Supervised Learning&#xff09;是一种重要的机器学习方法&#xff0c;它的目标是通过“已知输入特征”来预测对应的标签。在监督学习中&#xff0c;每一个“特征-标签”对被称为样本&#xff08;example&#xff09;&#xff0c;这些样…

高效快捷回复软件

当你的店铺正如火如荼地运营时&#xff0c;你是否曾因为繁琐的客服回复工作而感到力不从心&#xff1f;自己创业、自营客服或是外包客服&#xff0c;都需要一个强大的工具来帮助你高效处理客户咨询。那么&#xff0c;这款全新的高效快捷回复软件—客服宝聊天助手&#xff0c;就…

高考技术——pandas使用

百家讲坛&#xff0c;谈论古今&#xff0c;今天我们不聊别的&#xff0c;我们来聊一聊中国的国宝——大熊猫&#xff08;bushi&#xff09; 好好&#xff0c;言归正传&#xff0c;我们今天来讲pandas import pandas as pd 申明无需多言&#xff0c;高考主要考察Series和Data…

python3 torch 在windows 安装GPU环境

1,安装CUDA,下载,默认安装就行,注意安装目录,一般在这 "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA" 2,下载对应CUDA版本的CUDNN,下载完是个压缩包,解压 注意,这个要注册个账号,几分钟搞定 解压之后是这样的,把这3个目录下的所有文件,拷贝到CUDA安装目录…

文档信息提取系统源码分享

文档信息提取检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

《论文阅读》 用于产生移情反应的迭代联想记忆模型 ACL2024

《论文阅读》 用于产生移情反应的迭代联想记忆模型 ACL2024 前言简介任务定义模型架构Encoding Dialogue InformationCapturing Associated InformationPredicting Emotion and Generating Response损失函数问题前言 亲身阅读感受分享,细节画图解释,再也不用担心看不懂论文啦…

gMLP:Pay Attention to MLPs--模型代码讲解

gMLP模型代码讲解 IntroductiongMLP网络结构Spatial Gating Unit (SGU) codegMLPBlockSpatial Gating Unit 基于MLP-Mixer 的改进… Introduction 总的来说&#xff0c;gMLP 在视觉和NLP领域的惊人有效性表明&#xff0c;自我注意并不是扩大机器学习模型的必要因素&#xff0c…

新品:新一代全双工音频对讲模块SA618F22-C1

SA618F22-C1是我司一款升级版的无线数字和音频二合一全双工传输模块&#xff0c;支持8路并发高音质通话。用户不仅可以通过串口实现数据的无线传输&#xff0c;还可以通过I2S数字音频或模拟音频接口来传输语音信号。该模块内置高速微控制器、回声消除电路、ESD静电防护、高性能…

电脑退域或切换系统账号后系统黑屏

之前加入域时迁移了账号系统&#xff0c;导致退域后本地账号系统没了东西黑屏但能看到鼠标。也登不了域账号了一顿慌张&#xff08;操作如下&#xff09; 解决&#xff1a;又加回了域哈哈哈 重启电脑按F8进不去安全模式&#xff0c;找不到触发时间... winr打开运行&#xff0c;…

vue3+ts不能将类型“Timeout”分配给类型“null”不能将类型“Timeout”分配给类型number

在设置有setTimeout() 函数时&#xff0c;一般是需要进行清除计时器操作的&#xff1b; 常用的做法是定义一个全局变量timer&#xff0c;在onMounted或者有需要的地方进行赋值&#xff0c;在onBeforeUnmount进行clear&#xff0c;一般在定义timer变量时&#xff0c;使用 numbe…

we3.0里的钱包是什么?

we3.0里的钱包是什么&#xff1f; 在Web3.0的语境中&#xff0c;以太坊钱包是一种专为与以太坊区块链网络及其去中心化应用&#xff08;DApps&#xff09;交互而设计的数字钱包。这种钱包不仅支持用户存储、发送和接收以太币&#xff08;ETH&#xff09;&#xff0c;还允许用户…

深度学习:迁移学习

目录 一、迁移学习 1.什么是迁移学习 2.迁移学习的步骤 1、选择预训练的模型和适当的层 2、冻结预训练模型的参数 3、在新数据集上训练新增加的层 4、微调预训练模型的层 5、评估和测试 二、迁移学习实例 1.导入模型 2.冻结模型参数 3.修改参数 4.创建类&#xff…

C++多态原理

C多态原理 多态的原理动态绑定与静态绑定静态多态动态多态 虚函数存在哪的&#xff1f;虚表存在哪的&#xff1f; 多态的原理 // 这里常考一道笔试题&#xff1a;sizeof(Base)是多少&#xff1f; class Base { public:virtual void Func1(){cout << "Func1()"…

【单调栈】单调栈基础及经典案例

【单调栈】单调栈基础及经典案例 单调栈理论基础每日温度下一个更大元素Ⅰ下一个更大元素Ⅱ经典例题—接雨水思路一 暴力求解思路二 双指针优化思路三 单调栈解法 经典例题—柱状图中最大的矩形思路一 暴力求解思路二 单调栈 单调栈理论基础 单调栈的应用场景&#xff1a;要寻…

109.游戏安全项目:信息显示二-利用游戏通知辅助计算基址

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;易道云信息技术研究院 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要盲目相信…

Visual Studio使用与“Hello Word“的编写

1.打开Visual Studio点击"创建新项目" 2.点击"空项目"&#xff0c;并点击"下一步" 3.设置"项目名称"并"设置地址" 4.打开项目后&#xff0c;右击"源文件"并选择"添加"的"新建项" 5.点击"…

Java每日面试题(JVM)(day15)

目录 Java对象内存布局markWord 数据结构JDK1.8 JVM 内存结构JDK1.8堆内存结构GC垃圾回收如何发现垃圾如何回收垃圾 JVM调优参数 Java对象内存布局 markWord 数据结构 JDK1.8 JVM 内存结构 程序计数器: 线程私有&#xff0c;记录代码执行的位置. Java虚拟机栈: 线程私有&#…