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

信奥赛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://icebutterfly214.com/news/230813/

相关文章:

  • 动态调整保留周期(如高频访问文件延长生命周期)
  • [特殊字符]_微服务架构下的性能调优实战[20260108162541]
  • 综合能源系统中基于电转气和碳捕集系统的热电联产建模与优化研究(Matlab代码实现)
  • 【确认出席】鲜翾 金赛药业人工智能药物研究院院长丨上海·1月14日
  • 性价比高的海外代理IP:怎么选不踩坑
  • NS-USBLoader全能指南:Switch文件管理与RCM注入一键搞定
  • Gerber文件查看器终极指南:从新手到专家快速上手
  • deepseek_markdown_20260108_c5cec3
  • 高性价比升降机品牌推荐,让厨房高处空间触手可及的智能解决方案
  • Linux IFS 环境变量详解
  • Thinkphp的医疗健康管理平台
  • 探索之旅:基于.net 6 的多功能自用工具开发
  • Thinkphp的网上书店图书销售网站
  • 本地部署 Payara Server 公网访问
  • 深度学习毕设选题推荐:通过python-CNN卷积神经网络_pytorch框架对猫的类别识别
  • 计算机深度学习毕设实战-基于python卷积神经网络CNN的不同瓶子识别
  • 计算机深度学习毕设实战-通过python-CNN卷积神经网络_pytorch框架对猫的类别识别
  • 深度学习毕设项目推荐-基于python-CNN卷积神经网络对鸡和兔识别
  • 微信AI小程序“亿元计划”来了!你的APP如何一键接入,抢先变现?
  • 容器-Docker逃逸的各种手法总结!
  • 西门子PLC模拟量滤波程序:1200与1500通用的实用功能块
  • 2026 年用什么 CMS 做网站更合适?一些实际对比思考
  • 程序员必看:Docker+Dify+DeepSeek本地部署大模型+知识库完整教程(含实操,建议收藏)
  • 通信原理篇---常见的调制方式
  • AI的发展会促成共同富裕加速发展全行业的底层基础设施升级
  • 2026必备!9个一键生成论文工具,助继续教育学生轻松写论文!
  • 【计算机毕业设计案例】通过python_CNN卷积神经网络对鸡蛋是否破损识别
  • 用Hugging Face微调医疗BERT模型
  • 深度学习毕设项目推荐-通过python_CNN卷积神经网络对辣椒类别识别
  • 深度学习毕设项目:基于python-CNN卷积神经网络的水果识别