华为C++笔试--拓扑排序

题目:

某部门在开发一个代码分析工具,需要分析代码模块之间的依赖关系,用来确定模块的初始化顺序、是否有循环依赖等问题。“批量初始化”是指次可以初始化一个或多个模块。例如模块1依赖模块2模块3也依赖模块2,但模块1和3没有依赖关系。则必须先“批量初始化“模块2,再”批量初始化”模块1和3。现给定一组模块间的依赖关系,请计算需要”批量初始化”的次数。
每一个模块,包含自己的id,和其父亲id。

时间限制: C/C++ 1000ms,其他语言: 2000ms
内存限制:C/C++ 256MB,其他语言:512MB

输入
(1)第1行只有一个数字,表示模块总数N。
(2)随后的N行依次表示模块1到N的依赖数据。每行的第1个数据表示 依赖的模块数量 (不会超过N),之后的数字表示当前模块依赖的模块ID序列,该序列不会重复出现相同的数字,模块ID的取值一定在[1,N]之内。
(3)模块总数N取值范围 1<=N<=1000。
(4)每一行里面的数字按1个空格分隔

输出
输出”批量初始化次数”;
若有循环依赖无法完成初始化,则输出-1;

样例
输入:
5
3 2 3 4
1 5
1 5
1 5
0
输出: 3
解释:共5个模块。模块1依赖模块2、3、4;模块2依赖模块5;模块3依赖模块5;模块4依赖模块5;模块5没有依赖任何模块批量初始化顺序为(5)-2,3,4-1,共需”批量初始化"3次。

解题思路:

我们的目标是计算出“批量初始化”的次数,即我们需要找出所有模块的依赖关系,然后确定哪些模块可以同时初始化,最后计算出需要初始化的次数。

1、读取模块总数 N: 这是问题的第一行输入。
2、读取依赖关系: 接下来的 N 行中,每行表示一个模块及其依赖的模块ID。
3、构建依赖图: 使用一个图(可以用邻接表表示)来存储模块之间的依赖关系。
4、计算入度: 对于图中的每个节点,计算其入度(即有多少模块依赖于它)。
5、拓扑排序: 使用入度为0的节点开始,进行拓扑排序。在排序过程中,每次选择一个入度为0的节点,将其加入结果列表,并减少其所有依赖节点的入度。
6、检查循环依赖: 如果在拓扑排序过程中发现有节点的入度仍然不为0,说明存在循环依赖,无法完成初始化,返回-1。
7、计算批量初始化次数: 如果所有节点都被加入结果列表,那么返回结果列表的长度(即批量初始化的次数)。

C++程序实现

#include <iostream>
#include <vector>
#include <queue>using namespace std;// 添加依赖关系
void addEdge(vector<vector<int>> &graph, int u, int v) {graph[u].push_back(v);
}// 计算批量初始化次数
int calculateBatchInitializeCount(vector<vector<int>> &dependencies, int N) {// 构建有向图vector<vector<int>> graph(N + 1);for (int i = 0; i < dependencies.size(); ++i) {int module = dependencies[i][0];for (int j = 1; j < dependencies[i].size(); ++j) {addEdge(graph, module, dependencies[i][j]);}}// 计算每个模块的入度vector<int> inDegree(N + 1, 0);for (int i = 0; i < N; ++i) {for (int j : graph[i + 1]) {inDegree[j]++;}}// 找到所有入度为0的模块queue<int> queue;for (int i = 1; i <= N; ++i) {if (inDegree[i] == 0) {queue.push(i);}}int batchInitializeCount = 0;while (!queue.empty()) {int module = queue.front();queue.pop();batchInitializeCount++;// 减少其所有依赖模块的入度for (int child : graph[module]) {inDegree[child]--;if (inDegree[child] == 0) {queue.push(child);}}}// 检查是否所有模块都被初始化for (int i = 1; i <= N; ++i) {if (inDegree[i] > 0) {return -1;  // 存在循环依赖,无法完成初始化}}return batchInitializeCount;
}int main() {int N;cin >> N;vector<vector<int>> dependencies(N);for (int i = 0; i < N; ++i) {int count;cin >> count;dependencies[i].push_back(count);for (int j = 0; j < count; ++j) {int parent;cin >> parent;dependencies[i].push_back(parent);}}int result = calculateBatchInitializeCount(dependencies, N);cout << float(result) << endl;return 0;
}

这个程序按照解题思路执行,首先读取模块总数和依赖关系,然后构建依赖图并计算入度,接着找到所有入度为0的模块并进行拓扑排序。在排序过程中,每次选择一个入度为0的模块,将其加入结果列表,并减少其所有依赖节点的入度。如果所有节点都被加入结果列表,那么返回结果列表的长度,即批量初始化的次数。如果在这个过程中发现有节点的入度仍然不为0,说明存在循环依赖,无法完成初始化,返回-1。

程序的关键在于正确地构建依赖图和进行拓扑排序。使用一个图(邻接表形式)来表示模块之间的依赖关系,使用一个队列来存储入度为0的模块,并按照入度从0到N的顺序进行排序。

注意事项

1.程序中使用了vector和queue来自动管理内存和执行排序操作。
2.calculateBatchInitializeCount函数负责计算批量初始化次数,如果存在循环依赖,它将返回-1。
3.在主函数main中,程序读取输入并调用calculateBatchInitializeCount函数来获取结果。
4.程序输出的是一个单精度整数,因此使用float(result)来确保以浮点数的形式输出。

总结

这个程序是一个简单的图论应用,它使用拓扑排序来解决模块初始化问题。程序的时间复杂度主要取决于输入的模块数和模块间的依赖关系数量。在给出的输入范围内,这个程序应该能够在规定的时间内完成。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tritonserver学习之六:自定义c++、python custom backend实践

tritonserver学习之一&#xff1a;triton使用流程 tritonserver学习之二&#xff1a;tritonserver编译 tritonserver学习之三&#xff1a;tritonserver运行流程 tritonserver学习之四&#xff1a;命令行解析 tritonserver学习之五&#xff1a;backend实现机制 1、环境准备…

C/C++ (stdio.h)标准库详解

cstdio,在C语言中称为stdio.h。该库使用所谓的流与物理设备&#xff08;如键盘、打印机、终端&#xff09;或系统支持的任何其他类型的文件一起操作。 在本文将会通过介绍函数参数&#xff0c;举出实际的简单例子来帮助大家快速上手使用函数。 目录 一、流 二、库函数 1、F…

系统(产品)设计原则

引言 最近在写PRD时,经常会被问到一个问题:你是如何规避系统设计过程中的坑,避免了设计返工、开发返工和上线生产问题 ?后面想了想,大抵上是基于一些多年来总结的系统设计原则吧,本着好记性不如烂笔头,将这些经验一一记录下来,供后续与大家学习交流。 前端逻辑设计原则…

range函数用法完全解读

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 迭代器是 23 种设计模式中最常用的一种&#xff08;之一&#xff09;&#xff0c;在 Python 中随处可见它的身影&#xff0c;我们经常用到它&#xff0c;但是却不…

如何制作翻页效果的电子书

如何制作翻页效果的电子书&#xff1f;想必大家对这个问题也非常困扰吧&#xff01;不知道从何做起&#xff1f;不知道该怎么制作&#xff1f;那你看到这篇文章就对啦&#xff01;按照我说的去实践&#xff0c;你也能轻松制作 制作翻页效果的电子书并不复杂&#xff0c;只需要一…

基于ldap实现登录认证

最近开发的应用需要外协人员实现登录认证&#xff0c;外协人员的密码等信息已经录入到ldap, 需要连接ldap进行登录认证。下面先介绍一下登录的网络旅程图。 一.nginx实现AES加密 nginx请求处理入口&#xff08;前端请求为json格式&#xff09; location /aes {default_type te…

uniapp多格式文件选择(APP,H5)

uniapp多格式文件选择&#xff08;APP&#xff0c;H5&#xff09; 背景实现代码实现运行结果注意事项 尾巴 背景 从手机选择文件进行上传是移动端很常见的需求&#xff0c;在原生开发时由于平台专一性很容易实现。但是用uniapp开发官方提供的API在APP平台只能选择图片和视频&a…

Java RC4加密算法

一、RC4加密算法 在密码学中&#xff0c;RC4&#xff08;来自Rivest Cipher 4的缩写&#xff09;是一种流加密算法&#xff0c;密钥长度可变。它加解密使用相同的密钥&#xff0c;因此也属于对称加密算法。 百度百科 - RC4&#xff1a;https://baike.baidu.com/item/RC4/34545…

乔拓云教育系统:打造培训机构全面数字化转型新篇章

在当今数字化、信息化高速发展的时代&#xff0c;教育培训机构也需要与时俱进&#xff0c;借助先进的管理工具提升运营效率&#xff0c;优化学员学习体验。乔拓云教育系统正是这样一个全面、高效、一站式的解决方案&#xff0c;为教育培训机构提供强大的技术支持和全方位的服务…

Focaler-IoU:更聚焦的IoU损失

摘要 边界框回归在目标检测领域中起着至关重要的作用&#xff0c;而目标检测的定位精度在很大程度上取决于边界框回归的损失函数。现有的研究通过利用边界框之间的几何关系来提高回归性能&#xff0c;而忽略了难易样本分布对边界框回归的影响。本文分析了难易样本分布对回归结…

零基础学编程初级视频教程,中文编程工具免费版下载及编程源码文件下载

零基础学编程初级视频教程&#xff0c;中文编程工具免费版下载及编程源码文件下载 编程初级视频教程链接 https://edu.csdn.net/course/detail/39061 编程工具及实例源码文件下载可以点击最下方官网卡片——软件下载——常用工具下载——编程工具免费版下载及实例源码下载。…

灰度图恢复(100%用例)C卷(JavaPythonC++Node.jsC语言)

黑白图像常采用灰度图的方式存储,即图像的每个像素填充一个灰阶值,256阶灰度图是一个灰阶值取值范围为0-255的灰阶矩阵, 0表示全黑、255表示全白,范围内的其他值表示不同的灰度,比如下面的图像及其对应的灰阶矩阵: 但在计算机中实际存储时,会使用压缩算法,其中一种压缩格…

Ubuntu2204+ROS2(humble)+usb_cam内参标定

1、安装usb_cam包 pip install pydantic1.10.14sudo apt install ros-humble-usb-cam# 测试打开相机 ros2 launch usb_cam camera.launch.py# 显示图像 ros2 run image_view image_view image:/camera1/image_raw 2、安装 camera_calibration sudo apt install ros-humble-c…

PawSQL更新 | 新增18个SQL性能审核重写规则

PawSQL最新版本针对DML和DQL新增了审核和重写优化规则共计33个&#xff0c;整体的规则数目达到了83个&#xff0c;覆盖了正确性&#xff0c;安全性、可维护性、性能四个方面的SQL质量问题&#xff0c;并提供了优化建议&#xff0c;已经形成比较完善的针对数据操作的SQL质量审查…

防御保护--防火墙的可靠性

目录 前提&#xff1a; VGMP 接口故障切换场景 状态切换备份的过程 HRP 第一种备份方式 --- 自动备份 第二种备份方式 --- 手工备份 第三种备份方式 --- 快速备份 各备份场景过程分析 1&#xff0c;主备形成场景 2&#xff0c;主备模式下&#xff0c;接口故障切…

ElementUI组件:Button 按钮

button按钮 点击下载learnelementuispringboot项目源码 效果图 el-button.vue页面效果图 项目里el-button.vue代码 <script> export default {name: "el_button",// 注意这里的名称不能和 router inex.js里的name一样methods: {sendMsg() {// alert(1)xthi…

Linux系统中Docker的安装及常用组件的安装

什么是Docker Docker是一个开源的应用容器引擎&#xff0c;它可以让开发者将应用程序及其依赖项打包到一个可移植的镜像中&#xff0c;并发布到任何流行的操作系统上。Docker使用沙箱机制来隔离容器&#xff0c;使其相互独立&#xff0c;并简化了应用程序的部署和管理。沙箱机…

网工内推 | 资深网工,周末双休,厂商认证优先,14薪

01 群核科技 招聘岗位&#xff1a;资深网络运维工程师 职责描述&#xff1a; 1、负责公司IDC机房网络的规划及持续改进&#xff0c;保证网络稳定运行&#xff1b; 2、负责公司国内外传输线路建设&#xff0c;提高链路的高可用保证业务的SLA&#xff1b; 3、负责网络监控平台的…

阿尔泰科技—创新解决农业环境监测难题!

引言 “农业是人类生活中不可或缺的重要领域&#xff0c;而农业环境的监测与保护对于农作物的生长和农业生产的可持续发展至关重要。为了解决农业环境参数监测的难题&#xff0c;阿尔泰科技提供了一套先进的解决方案&#xff0c;利用USB5630-D数据采集卡搭配传感器测试方案&a…

python面向对象三大特性

封装 python的封装是将事物的特征和行为&#xff0c;封装成对应的属性和方法 魔法方法 魔法方法是指不需要主动调用&#xff0c;在某种特定情况下自动调用的方法。 魔法方法的定义方式&#xff1a;__方法名__() 初始化方法 python中类的初始化方法为__init__() 是一个魔…