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

Milk Scheduling S——拓扑排序

农民约翰有N头奶牛(1<=N<=10,000),编号为1...N。每一头奶牛需要T(i)单位的时间来挤奶。不幸的是,由于FJ的仓库布局,一些奶牛要在别的牛之前挤奶。比如说,如果奶牛A必须在奶牛B前挤奶,FJ就需要在给奶牛B挤奶前结束给奶牛A的挤奶。
为了尽量完成挤奶任务,FJ聘请了一大批雇工协助任务——同一时刻足够去给任意数量的奶牛挤奶。然而,尽管奶牛可以同时挤奶,但仍需要满足以上的挤奶先后顺序。请帮助FJ计算挤奶过程中的最小总时间。

输入格式
第 1 行:两个空格分隔的整数:N(奶牛数量)和 M(挤奶约束数量;1 <= M <= 50,000)。
第 2..1+N 行:第 i+1 行包含 T(i) 的值 (1 <= T(i) <= 100,000)。
第 2+N 到1+N+M 行:每行包含两个空格分隔的整数 A 和 B,表示奶牛 A 必须完全挤奶,然后才能开始给奶牛 B 挤奶。这些限制永远不会形成循环,因此解决方案总是可能的。

输出格式
挤奶所有奶牛所需的最短时间。

输入样例:
3 1 
10 


3 2


输出样例:
11

解析

提到先后顺序,就不难想到拓扑排序。值得注意的是,虽然这道题问的是总时间的最小值,但我们要求的是这张图的最长路。下面我们来证明一下:
首先要明确的是,题目给定的图不一定连通(样例就具有这个性质),因此我们就要把它分成多个部分。
接着可以得出两个结论:每个部分之间是相互独立的,用题目的话说就是可以同时挤奶;每个部分内部是相互约束的,必须要等前面的奶牛挤完后再挤下一只。
最后,我们设每个部分的用时为 t1 ,t2 ,...,tk ,不难得出总用时为 max{t1 ,t2 ,...,tk},即为原图最长路。

#include <bits/stdc++.h>
using namespace std;
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
typedef pair<int,int> PII;
const int N=2e6+10;
vector <int> g[N];
int d[N],t[N],w[N];
int n,m;
queue <int> q;
signed main()
{ios;cin>>n>>m;for (int i=1;i<=n;i++) cin>>t[i];while (m--){int a,b;cin>>a>>b;g[a].push_back(b);d[b]++;}for (int i=1;i<=n;i++){if (!d[i]) {q.push(i);w[i]=t[i];}}while(q.size()){int u=q.front();q.pop();for (auto x:g[u]){w[x]=max(w[x],w[u]+t[x]);d[x]--;if (!d[x]) q.push(x);}}int ans=0;for (int i=1;i<=n;i++) ans=max(ans,w[i]);cout<<ans;return 0;
}

相关文章:

  • C++学习 --pair
  • .Net Web项目创建比较不错的参考文章
  • opencv(3):控制鼠标,创建 tackbar控件
  • Django学习日志05
  • vscode 配置 lua
  • 量化交易:公司基本面的量化
  • pytorch 安装 2023年
  • 【咖啡品牌分析】Google Maps数据采集咖啡市场数据分析区域分析热度分布分析数据抓取瑞幸星巴克
  • Hoppscotch:开源 API 开发工具,快捷实用 | 开源日报 No.77
  • Polygon zkEVM的Dragon Fruit和Inca Berry升级
  • Python------列表 集合 字典 推导式(本文以 集合为主)
  • 编译智能合约以及前端交互工具库(Web3项目一实战之三)
  • 视频怎么做成二维码?在线教学视频码的制作技巧
  • FISCO BCOS 3.0【02】配置和使用系统自带的控制台
  • MFC 对话框
  • ➹使用webpack配置多页面应用(MPA)
  • golang中接口赋值与方法集
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • MD5加密原理解析及OC版原理实现
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • Vue 重置组件到初始状态
  • Web标准制定过程
  • 分布式事物理论与实践
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 前端js -- this指向总结。
  • 前端临床手札——文件上传
  • 如何设计一个比特币钱包服务
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • #HarmonyOS:基础语法
  • #mysql 8.0 踩坑日记
  • #控制台大学课堂点名问题_课堂随机点名
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (06)Hive——正则表达式
  • (6)添加vue-cookie
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (TOJ2804)Even? Odd?
  • (初研) Sentence-embedding fine-tune notebook
  • (二)换源+apt-get基础配置+搜狗拼音
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (理论篇)httpmoudle和httphandler一览
  • (三) diretfbrc详解
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (转)Linux下编译安装log4cxx
  • (转)编辑寄语:因为爱心,所以美丽
  • .Net Core和.Net Standard直观理解
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET 药厂业务系统 CPU爆高分析
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET和.COM和.CN域名区别
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .NET开源项目介绍及资源推荐:数据持久层