信奥赛C++提高组csp-s之拓扑排序(案例实践)

信奥赛C++提高组csp-s之拓扑排序(案例实践)

杂务 (Job Processing)

问题描述

有n个杂务需要完成,某些杂务必须在另一些杂务完成之后才能开始。每个杂务都有完成所需的时间。求完成所有杂务所需的最短时间。

输入格式
  • 第一行:整数n (1 ≤ n ≤ 10,000),表示杂务数量
  • 接下来n行:每行描述一个杂务
    • 第一个数:该杂务的编号
    • 第二个数:完成该杂务所需时间
    • 后面的数:该杂务的前驱杂务编号列表,以0结束
输出格式

一个整数,表示完成所有杂务所需的最短时间

题目分析

本题要求计算完成所有杂务的最短时间。杂务之间存在依赖关系(某些杂务必须在另一些完成后才能开始),但互不依赖的杂务可以同时进行。由于依赖关系仅存在于编号较小的杂务中,整个依赖图是一个有向无环图(DAG),因此可以通过拓扑排序求解。

解题思路
  1. 问题建模:将每个杂务视为图中的节点,依赖关系视为有向边(从准备工作指向当前杂务)。同时记录每个杂务的耗时和入度(依赖的前驱数量)。
  2. 拓扑排序:从入度为0的节点(无依赖的杂务)开始处理,逐步处理依赖这些节点的后续杂务。
  3. 动态更新最早完成时间:对于每个杂务,其最早完成时间等于所有前驱节点最早完成时间的最大值加上当前杂务的耗时。
  4. 计算全局最大值:所有杂务的最早完成时间中的最大值即为完成所有杂务的最短时间。

代码实现

#include<bits/stdc++.h>usingnamespacestd;constintN=10010;intn;vector<int>a[N];// 邻接表,a[u]存储所有u指向的后继节点(u完成后才能进行的任务)intd[N];// 入度数组,d[i]表示杂务i的入度(依赖的前驱数量)intt[N];// t[i]表示杂务i的耗时intmint[N];// mint[i]表示杂务i的最早完成时间intmain(){cin>>n;// 读取n个杂务的数据for(inti=1;i<=n;i++){intid,cost,pre;cin>>id>>cost;// 读入杂务序号和耗时t[id]=cost;// 存储耗时// 读取该杂务的所有前驱(准备工作),以0结束while(cin>>pre&&pre!=0){a[pre].push_back(id);// 添加依赖关系:pre -> idd[id]++;// id的入度增加}}queue<int>q;// 用于拓扑排序的队列// 初始化:将所有入度为0的杂务加入队列for(inti=1;i<=n;i++){if(d[i]==0){q.push(i);mint[i]=t[i];// 无依赖的杂务,最早完成时间即自身耗时}}intans=0;// 记录所有杂务的最早完成时间中的最大值// 拓扑排序while(!q.empty()){intu=q.front();// 取出一个入度为0的节点q.pop();// 更新全局最大完成时间ans=max(ans,mint[u]);// 遍历u的所有后继节点for(intv:a[u]){// 更新v的最早完成时间:必须等所有前驱完成,取最大值mint[v]=max(mint[v],mint[u]+t[v]);// 减少v的入度(因为u已完成)d[v]--;// 如果v的入度变为0,加入队列if(d[v]==0){q.push(v);}}}cout<<ans<<endl;// 输出所有杂务完成的最短时间return0;}

功能分析

  1. 数据存储

    • a[N]:邻接表存储依赖关系(有向边)。
    • d[N]:记录每个节点的入度(前驱数量)。
    • t[N]:记录每个杂务的耗时。
    • mint[N]:动态记录每个杂务的最早完成时间。
  2. 拓扑排序流程

    • 初始化:将所有入度为0的杂务加入队列,并初始化其最早完成时间。
    • 队列处理
      • 取出队首节点,用其最早完成时间更新全局答案。
      • 遍历该节点的所有后继节点:
        • 更新后继节点的最早完成时间(取当前值与新路径值的最大值)。
        • 减少后继节点的入度,若入度为0则加入队列。
  3. 关键点

    • 最早完成时间计算:每个杂务的最早完成时间取决于所有前驱完成时间的最大值(因为必须等待所有准备工作完成)。
    • 并行处理:由于不依赖的杂务可以同时进行,全局答案只需取所有杂务完成时间的最大值。

该算法时间复杂度为O(N + E),其中N为杂务数量,E为依赖边数量,满足题目要求。

各种学习资料,助力大家一站式学习和提升!!!

#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"########## 一站式掌握信奥赛知识! ##########";cout<<"############# 冲刺信奥赛拿奖! #############";cout<<"###### 课程购买后永久学习,不受限制! ######";return0;}
  • 一、CSP信奥赛C++通关学习视频课:
    • C++语法基础
    • C++语法进阶
    • C++算法
    • C++数据结构
    • CSP信奥赛数学
    • CSP信奥赛STL
  • 二、CSP信奥赛C++竞赛拿奖视频课:
    • 信奥赛csp-j初赛高频考点解析
    • CSP信奥赛C++复赛集训课(12大高频考点专题集训)
  • 三、csp高频考点知识详解及案例实践:
    • CSP信奥赛C++之动态规划
    • CSP信奥赛C++之标准模板库STL
    • 信奥赛C++提高组csp-s知识详解及案例实践
  • 四、考级、竞赛刷题题单及题解:
    • GESP C++考级真题题解
    • CSP信奥赛C++初赛及复赛高频考点真题解析
    • CSP信奥赛C++一等奖通关刷题题单及题解

详细内容:

1、csp/信奥赛C++,完整信奥赛系列课程(永久学习):

https://edu.csdn.net/lecturer/7901 点击跳转


2、CSP信奥赛C++竞赛拿奖视频课:

https://edu.csdn.net/course/detail/40437 点击跳转

3、csp信奥赛高频考点知识详解及案例实践:

CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转

CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转

信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html

4、csp信奥赛冲刺一等奖有效刷题题解:

CSP信奥赛C++初赛及复赛高频考点真题解析(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转

CSP信奥赛C++一等奖通关刷题题单及题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转

5、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转

· 文末祝福 ·

#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"跟着王老师一起学习信奥赛C++";cout<<" 成就更好的自己! ";cout<<" csp信奥赛一等奖属于你! ";return0;}

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

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

相关文章

前后端分离学科竞赛管理系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程

摘要 随着信息技术的快速发展&#xff0c;学科竞赛管理系统的信息化和智能化需求日益增长。传统的学科竞赛管理模式依赖人工操作&#xff0c;效率低下且容易出错&#xff0c;难以满足大规模竞赛活动的需求。为了解决这一问题&#xff0c;设计并实现一个基于前后端分离架构的学科…

Java笔记9

目录 集合 面向对象进阶 继承【补充】 多态【补充】 static关键字 包 Final关键字 代码块 集合 集合和数组的区分&#xff1a; 数组&#xff1a;长度固定不变&#xff0c;存储类型&#xff1a;可以存储基本数据类型&#xff0c;也可以存储引用数据类型集合&#xff1…

UE5 C++(15):宏 UFUNCTION() 修饰成员函数,BlueprintCallable,Category,BlueprintPure 纯函数,

&#xff08;84&#xff09;宏 UFUNCTION() 把类的成员函数暴露给蓝图 &#xff1a;&#xff08;85&#xff09;pure 纯函数&#xff0c;无执行引脚 &#xff1a; 如图&#xff0c; 蓝图中也可以通过细节面板来定义纯函数 &#xff1a; 一言的解释 &#xff1a;&#xff08;86&…

拆解 Claude Code:Coding Agent 终于“能用”背后的架构真相

大家好&#xff0c;我是Tony Bai。 在过去两年里&#xff0c;我们见证了 AI Coding Agent的尴尬童年&#xff1a;从最初笨拙的 Copy-Paste&#xff0c;到 Cursor 的 VS Code Fork 革命&#xff0c;再到如今 Claude Code 这种 CLI Coding Agent的出现。 为什么以前的 Agent 总是…

认识can

本文对工作中can的一些总结can是一种网络协议&#xff0c;主要分can和canfd(高速can&#xff09;canfd速度快&#xff0c;当然成本也高。canfd更多应用与智驾等&#xff0c;can主要用于中控等根据需求决定使用。实战&#xff1a;linux 上位机发送canfd报文<CAN_ID>##<…

认识can

本文对工作中can的一些总结can是一种网络协议&#xff0c;主要分can和canfd(高速can&#xff09;canfd速度快&#xff0c;当然成本也高。canfd更多应用与智驾等&#xff0c;can主要用于中控等根据需求决定使用。实战&#xff1a;linux 上位机发送canfd报文<CAN_ID>##<…

【脉脉】AI创作者AMA知无不言:人机共生时代的创作觉醒

&#x1f3ac; 个人主页&#xff1a;艾莉丝努力练剑❄专栏传送门&#xff1a;《C语言》《数据结构与算法》《C/C干货分享&学习过程记录》 《Linux操作系统编程详解》《笔试/面试常见算法&#xff1a;从基础到进阶》《Python干货分享》⭐️为天地立心&#xff0c;为生民立命…

Go语言数据结构和算法(三十四)分治算法

分治算法是将一个巨大的输入分解成若干个小块.在每个小块上解决问题.然后将分段解决方案合并为全局解决方案.1.步骤:分解:将原始问题分解成一组子问题.解决子问题:递归的单独解决每个子问题.合并子问题:将子问题的解放在一起得到整个问题的解.2.应用:2.1快速排序:又称分区交互排…

go语言初认识

背景: python粗略算是懂后, 了解到近期热门的一种语言go。 在多进程等方面的确有很多优势&#xff0c;尤其在解析pcap等时&#xff0c;算力强大&#xff0c;运行时间直接少了一半以上&#xff0c;应用在后端也非常有优势。 本文记录go语言的学习和实战应用。 安装go : linux…

ai-agent 一个强大的辅助工具

随着ai的大热&#xff0c;如何更好的利用ai&#xff0c;而不单单作为知识的查询。如果它能帮我们设计测试用例&#xff0c;执行用例&#xff0c;并给出结果&#xff0c;甚至可以帮我们开发&#xff0c;是不是一个梦中情tool。 这不单单是幻想&#xff0c;目前不少大厂已经实现&…

这些 Web 技术,我学完就后悔:别像我一样把时间浪费在“看起来很香”的坑里

我有一支技术全面、经验丰富的小型团队&#xff0c;专注高效交付中等规模外包项目&#xff0c;有需要外包项目的可以联系我2015 年我刚一头扎进 Web 开发时&#xff0c;脑子里只有一句话&#xff1a;多学点&#xff0c;总没坏处。于是我像捡破烂一样追教程、刷博客、看 YouTube…

这些 Web 技术,我学完就后悔:别像我一样把时间浪费在“看起来很香”的坑里

我有一支技术全面、经验丰富的小型团队&#xff0c;专注高效交付中等规模外包项目&#xff0c;有需要外包项目的可以联系我2015 年我刚一头扎进 Web 开发时&#xff0c;脑子里只有一句话&#xff1a;多学点&#xff0c;总没坏处。于是我像捡破烂一样追教程、刷博客、看 YouTube…

quickbi数据集报错

错误码: NOX5200013traceId: a2b3506c-aa59-4b01-a48e-2aa348021a72[NOX5200013] invalid calculate field [直播购买客户], expression syntax error or some dependence field [14513112cb] has gone.原因&#xff1a;之前新建的维度字段或者计算字段&#xff0c;依赖了其他字…

TypeScript 的本质并非类型,而是信任

我有一支技术全面、经验丰富的小型团队&#xff0c;专注高效交付中等规模外包项目&#xff0c;有需要外包项目的可以联系我静态类型悄悄修好的&#xff0c;不只是语法错误&#xff0c;而是你们的精神状态。老实说&#xff0c;我第一次听到 TypeScript 的时候&#xff0c;脑子里…

DSP算法学习

都是以QPSK为例针对不同的qam信号&#xff0c;一些算法可能不同&#xff0c;还需读者再去学习从IQ时延对准-IQ不平衡-粗色散补偿-自适应均衡解复用-频偏估计与补偿-载波相位恢复

信任与怀疑之间,我们如何与AI医生共存?

2025年&#xff0c;如果你在深夜感到喉咙干痒、轻微发热&#xff0c;第一反应可能不再是翻找家里的退烧药&#xff0c;而是打开手机&#xff0c;对着某款AI健康应用描述症状。几秒钟后&#xff0c;屏幕上跳出一行字&#xff1a;初步判断为风热感冒初期&#xff0c;建议多饮水、…

年底的 Java 行情怎么样?

大家好&#xff0c;我是R哥。2025 年的最后一个月了&#xff0c;也是最后一天了&#xff0c;说说这个月的 Java 行情怎么样。拿我们面试辅导的战绩来说吧&#xff0c;最后一个月 Offer 虽然不多&#xff0c;但质量非常高&#xff0c;都是互联网大厂&#xff08;字节、阿里、腾讯…

计及光伏电站快速无功响应特性的分布式电源优化配置方法(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&a…

【无功优化】基于二阶锥规划的配电网无功优化算法【IEEE33节点】(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&a…

动态调整保留周期(如高频访问文件延长生命周期)

临时文件自动化管理方案技术文章大纲背景与需求分析临时文件的定义与常见场景&#xff08;如日志、缓存、中间计算结果&#xff09;管理痛点&#xff1a;空间占用、安全风险、手动清理效率低自动化管理的核心目标&#xff1a;效率提升、资源优化、安全性保障技术方案设计要点生…