关键活动——拓扑排序

假定一个工程项目由一组子任务构成,子任务之间有的可以并行执行,有的必须在完成了其它一些子任务后才能执行。“任务调度”包括一组子任务、以及每个子任务可以执行所依赖的子任务集。
比如完成一个专业的所有课程学习和毕业设计可以看成一个本科生要完成的一项工程,各门课程可以看成是子任务。有些课程可以同时开设,比如英语和C程序设计,它们没有必须先修哪门的约束;有些课程则不可以同时开设,因为它们有先后的依赖关系,比如C程序设计和数据结构两门课,必须先学习前者。
但是需要注意的是,对一组子任务,并不是任意的任务调度都是一个可行的方案。比如方案中存在“子任务A依赖于子任务B,子任务B依赖于子任务C,子任务C又依赖于子任务A”,那么这三个任务哪个都不能先执行,这就是一个不可行的方案。
任务调度问题中,如果还给出了完成每个子任务需要的时间,则我们可以算出完成整个工程需要的最短时间。在这些子任务中,有些任务即使推迟几天完成,也不会影响全局的工期;但是有些任务必须准时完成,否则整个项目的工期就要因此延误,这种任务就叫“关键活动”。
请编写程序判定一个给定的工程项目的任务调度是否可行;如果该调度方案可行,则计算完成整个工程项目需要的最短时间,并输出所有的关键活动。

输入格式:
输入第1行给出两个正整数N(≤100)和M,其中N是任务交接点(即衔接相互依赖的两个子任务的节点,例如:若任务2要在任务1完成后才开始,则两任务之间必有一个交接点)的数量。交接点按1~N编号,M是子任务的数量,依次编号为1~M。随后M行,每行给出了3个正整数,分别是该任务开始和完成涉及的交接点编号以及该任务所需的时间,整数间用空格分隔。

输出格式:
如果任务调度不可行,则输出0;否则第1行输出完成整个工程项目需要的时间,第2行开始输出所有关键活动,每个关键活动占一行,按格式“V->W”输出,其中V和W为该任务开始和完成涉及的交接点编号。关键活动输出的顺序规则是:任务开始的交接点编号小者优先,起点编号相同时,与输入时任务的顺序相反。

输入样例:
7 8
1 2 4
1 3 3
2 4 5
3 4 3
4 5 1
4 6 6
5 7 5
6 7 2

输出样例:
17
1->2
2->4
4->6
6->7

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ULL unsigned long long 
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
typedef pair<int,int> PII;
const int N=2e5+10;
struct node
{int v,w;
};
vector <node> g[N],h[N];
vector <int> k;
int in[N],out[N],early[N],last[N];
queue <int> q;
int n,m;
bool topu()
{for (int i=1;i<=n;i++){if (!in[i]) q.push(i);}while (q.size()){int u=q.front();q.pop();k.push_back(u);for (auto x:g[u]){int v=x.v,w=x.w;in[v]--;if (!in[v]) q.push(v);}}if (k.size()==n) return 1;else return 0;
}
signed main()
{ios;cin>>n>>m;while (m--){int a,v,w;cin>>a>>v>>w;g[a].push_back({v,w});h[v].push_back({a,w});in[v]++;out[a]++;}if (topu()){int maxx=0;for (auto u:k){for (auto x:g[u]){int v=x.v,w=x.w;if (early[u]+w>early[v]) {early[v]=early[u]+w;maxx=max(maxx,early[v]);}}}cout<<maxx<<endl;int minn=0x3f3f3f3f;memset (last,0x3f,sizeof last);for (auto u:k){if (!out[u]) last[u]=maxx;}for (int i=k.size()-1;i>=0;i--){int u=k[i];for (auto x:h[u]){int v=x.v,w=x.w;if (last[u]-w<last[v]) last[v]=last[u]-w;}}for (int i=1;i<=n;i++){for (int j=g[i].size()-1;j>=0;j--){auto x=g[i][j];int v=x.v,w=x.w;if (last[v]-w==early[i]) cout<<i<<"->"<<v<<endl;}}}else cout<<"0";return 0;
}

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

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

相关文章

Kafka 的特点和优势

Apache Kafka 作为一款分布式流处理平台&#xff0c;以其独特的特点和卓越的优势成为实时数据处理领域的瑰宝。本文将深入研究 Kafka 的各项特点和优势&#xff0c;并通过详实的示例代码展示其在不同场景下的强大应用。 高吞吐量和水平扩展 Kafka 的设计注重高吞吐量和水平扩…

Python-炸弹人【附完整源码】

炸弹人 炸弹人是童年的一款经典电子游戏&#xff0c;玩家控制一个类似"炸弹人"的角色&#xff0c;这个角色可以放置炸弹&#xff0c;并在指定的时间内引爆它们消灭敌人以达到目标&#xff0c;此游戏共设有两节关卡&#xff0c;代码如下&#xff1a; 运行效果&#x…

python将时间戳转换为时间

python将时间戳转换为时间 import datetime timestamp 1701862813779 # 将时间戳转换为秒&#xff08;因为Python的timestamp通常是以秒为单位的&#xff09; timestamp_seconds timestamp / 1000 # 将时间戳转换为UTC时间 utc_time datetime.datetime.utcfromti…

[原创][5]探究C#多线程开发细节-利用AutoResetEvent类解决多线程循环轮询假同步的问题.

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ联系: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、D…

【昇腾CANN技术月刊】2023.11-Ascend C在线课程上新;CANN 7.0大模型推理部署技术解密;特邀名校老师面对面分享Ascend C开发经验

【Ascend C】昇腾Ascend C算子开发入门课程&#xff0c;新手零基础入门 摘要&#xff1a;本课程是Ascend C算子开发的初级教程&#xff0c;通过课程讲解及样例实操&#xff0c;帮助你学习如何使用Ascend C开发矢量算子。 1、了解并行计算架构、并行计算方法等基本概念 2、理解…

空间金字塔池化(SPP,Spatial Pyramid Pooling)系列

空间金字塔池化的作用是解决输入图片大小不一造成的缺陷&#xff0c;同时在目标识别中增加了精度。空间金字塔池化可以使得任意大小的特征图都能够转换成固定大小的特征向量&#xff0c;下面针对一些典型的空间金字塔进行盘点。 部分图片来自blog:空间金字塔池化改进 SPP / SP…

优雅处理MyBatis与Apollo集成中的配置加载

⭐️前言 MyBatis作为一种优秀的持久层框架&#xff0c;在使用MyBatis的过程中&#xff0c;我们经常需要从配置文件中读取一些参数&#xff0c;以便在mapper文件中使用。本文将介绍在不使用传参的情况下&#xff0c;如何从Apollo配置中读取这些参数&#xff0c;以及在mapper文…

SD-WAN异地组网提升多元企业网络体验

SD-WAN&#xff08;软件定义广域网&#xff09;异地组网方案是一种灵活、可靠且高效的解决方案&#xff0c;能够满足许多企业的组网需求。在这个全球化和数字化快速发展的时代&#xff0c;越来越多的企业开始关注网络连接的稳定性&#xff0c;而SD-WAN因其卓越的网络连接体验&a…

每天一点python——day88

#每天一点Python——88 #编程两大思想【面向过程与面向对象】 #如图&#xff1a; 面向过程的线性思维&#xff1a; 类似于做菜一步步的来&#xff0c;先怎么样怎么样&#xff0c;再怎么样 如果不一步步的来&#xff0c;例如先炒菜再点火&#xff0c;这样是做不好的 面向对象&a…

IntelliJ IDE 插件开发 | (二)UI 界面与数据持久化

系列文章 IntelliJ IDE 插件开发 |&#xff08;一&#xff09;快速入门 前言 在上一篇文章中介绍了在IDEA下开发、运行和安装插件的基本步骤&#xff0c;因此创建项目等基础步骤不再赘述&#xff0c;本文则开始介绍如何进行 UI 界面的开发以及相关数据的持久化存储&#xff…

安全测试工具,自动发现网站所有URL!

作为一个安全测试人员来说&#xff0c;首先要拿到网站所有url&#xff0c;然后根据拿到的url进行渗透测试进行漏洞挖掘。本文给大家介绍的是如何拿到一个网站所有的url。 深度爬取层级控制 现在我也找了很多测试的朋友&#xff0c;做了一个分享技术的交流群&#xff0c;共享了很…

拷贝构造函数:对象复制的重要工具

拷贝构造函数 功能&#xff1a; 使用一个已经存在的对象来初始化一个新的同一类型的对象。 声明&#xff1a; 只有一个参数并且参数为该类对象的引用 如果类中没有说明拷贝构造函数&#xff0c;则系统会自动生成一个缺省复制构造函数&#xff0c;作为该类的公有成员。 当函数…

ospf选路

问题描述 R6通过主备份路径访问LSP&#xff08;R1&#xff09;&#xff0c;主为R2&#xff0c; 备为R3 解决方案 路由器1看作LSP&#xff0c;配置loopback 0 ,地址为1.1.1.1 供测试使用&#xff1b;路由器 236, LSW4和LSW5&#xff0c; 运行ospf处于相同区域&#xff0c;建立…

<JavaEE> 经典设计模式之 -- 定时器

目录 一、定时器的概念 二、Java 标准库中的定时器 三、实现自己的定时器 一、定时器的概念 什么是定时器&#xff1f;定时器是软件开发中的一个常用且重要组件&#xff0c;作用是在达到设定时间后&#xff0c;执行指定的代码。 二、Java 标准库中的定时器 1&#xff09;T…

Redis核心知识点总结

1.Redis介绍 Redis 是 NoSQL&#xff0c;但是可处理 1 秒 10w 的并发&#xff08;数据都在内存中&#xff09; 使用 java 对 redis 进行操作类似 jdbc 接口标准对 mysql&#xff0c;有各类实现他的实现类&#xff0c;我们常用的是 druid 其中对 redis&#xff0c;我们通常用 J…

C语言 if语句有无(;)分号问题

在C语言中&#xff0c;if语句后面不带分号&#xff08;;&#xff09;的情况有两种主要形式&#xff1a; 1. 带有大括号的代码块&#xff1a;如果if语句后面跟随一个由大括号&#xff08;{}&#xff09;包围的代码块&#xff0c;那么这个代码块中的语句只有在if条件为真时才会执…

【C语言】7-38 吉老师的回归 分数 15

7-38 吉老师的回归 分数 15 全屏浏览题目 切换布局 作者 DAI, Longao 单位 杭州百腾教育科技有限公司 曾经在天梯赛大杀四方的吉老师决定回归天梯赛赛场啦&#xff01; 为了简化题目&#xff0c;我们不妨假设天梯赛的每道题目可以用一个不超过 500 的、只包括可打印符号的…

分类与群组:解析分类和聚类分析技术

目录 写在开头1. 数据分类与聚类简介1.1 分类分析1.2 聚类分析1.3 对比分析2. 如何学习分类和聚类分析技术2.1 学习理论知识2.1.1 数学知识2.1.2 编程基础2.1.3 深入学习算法2.1.3.1 分类算法学习举例2.1.3.2 聚类算法学习举例2.1.4 参与实战2.2 应用成功案例2.2.1 分类算法成功…

16、XSS——会话管理

文章目录 一、web会话管理概述1.1 会话管理1.2 为什么需要会话管理&#xff1f;1.3 常见的web应用会话管理的方式 二、会话管理方式2.1 基于server端的session的管理方式2.2 cookie-based的管理方式2.3 token-based的管理方式 三、安全问题 一、web会话管理概述 1.1 会话管理 …

加速度jsudo:IC商城系统4.0版正式发布 PCB计价电子元器件商城

近日&#xff0c;在加速度软件新品会发布会上&#xff0c;Mike正式公布了其4.0版本的电子元器件商城系统&#xff0c;展示了迭代后的强大新功能。在招募了数十家元器件销售、运营和老板测试体验后&#xff0c;获得了大家一致的好评。其中&#xff0c;中国电子南京某子公司董事长…