关键路径 p3 清华复试上机题
关键路径 p3 清华复试上机题
题目描述
小H为了完成一篇论文,一共要完成n个实验。其中第i个实验需要a[i]的时问去完成。小H可以同时进行若干实验,但存在一些实验,只有当它的若干前置实验完成时,才能开始进行该实验。同时我们认为小H在一个实验的前置实验都完成时,就能马上开始该实验。
为了让小H 尽快完成论文,需要知道在最优的情况下,最后一个完成的实验什么时候完成。
小H还想知道,在保证最后一个实验尽快完成的情况下(即保证上一间的答案不变),他想知道每个实验最晚可以什么时候开始。
设第i个实验最早可能的开始时问为fi,不能响最后一个实验完成时间的最晚开始时间为gi,请证明\(\prod_{i=0}^{n}(g_i-f_i+1)\)除以\(10^9+7\)所得的余数能够保证题目有解。
输入
从标淮输入读入数据。
第一行输入两个整数n,m。
第二行输入n个正整数 a,a[2],…,a[n],描述完成每个实验所需要的时间。
接下来读入 m 行,每行读入两个整数u,v,表示编号为u的实验是编号为v的实验的前置实验。
对于所有的输入数据,都满足\(1\leqslant n \leqslant 10^5\),\(1\leqslant m \leqslant 5×10^5\),\(1\leqslant a_i\leqslant 10^6\).
输出
输出到标准输出。
第一行输出一个整数,表示完成实验的时间。
第二行输出一个整数表示\(\prod_{i=0}^{n}(g_i-f_i+1)\)除以\(10^9+7\)所得的余数。
样例输入
7 5
11 20 17 10 11 17 17
5 4
6 1
7 3
2 4
2 1
样例输出
34
7840
解题思路
求关键路径的长度,记录每个实验最早开始时间和最晚开始时间。典型关键路径问题。
代码实现
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 7;
const int INF = INT_MAX;
const int MOD = 1e9 + 7;
vector<int> graph[maxn];
int inDegree[maxn];
ll earliest[maxn];
ll latest[maxn];
ll timee[maxn];
ll criticalPath(int n) {
vector<int> topology;
queue<int> q;
for (int i = 1; i <= n; ++i) {
if (inDegree[i] == 0) {
q.push(i);
}
}
ll totalTime = 0;//总耗时
while (!q.empty()) {
int u = q.front();
topology.push_back(u);
q.pop();
for (int i = 0; i < graph[u].size(); ++i) {
int v = graph[u][i];
inDegree[v]--;
earliest[v] = max(earliest[v], timee[u] + latest[u]);//取最大值的原因:只有当前结点的所有前驱结点活动全部完成,才能完成本结点
if (inDegree[v] == 0) {
q.push(v);
totalTime = max(totalTime, earliest[v] + timee[v]);//关键路径长度为最大路径长度的路径
}
}
}
for (int i = topology.size() - 1; i >= 0; --i) {//逆拓扑排序求最迟开始时间
int u = topology[i];
if (graph[u].size() == 0) {
latest[u] = totalTime - timee[u];//出度为0的点,最晚开始时间为关键路径长度减去其耗费时间
} else {
latest[u] = INF;//后面要求最小值,初始化为极大值
}
for (int j = 0; j < graph[u].size(); ++j) {
int v = graph[u][j];
latest[u] = min(latest[u], latest[v] - timee[u]);//非出度为0的点,最晚开始时间为所有其后续节点最晚开始时间减去该节点耗费时间的最小值
}
}
return totalTime;
}
int main() {
int n, m;
while (cin >> n >> m) {
memset(graph, 0, sizeof graph);
memset(inDegree, 0, sizeof inDegree);
memset(earliest, 0, sizeof earliest);
memset(latest, 0, sizeof latest);
memset(timee, 0, sizeof timee);
for (int i = 1; i <= n; i++) {
cin >> timee[i];
}
while (m--) {
int from, to;
cin >> from >> to;
graph[from].push_back(to);
inDegree[to]++;
}
ll totalTime = criticalPath(n);
ll answer = 1;
for (int i = 1; i <= n; ++i) {
answer *= latest[i] - earliest[i] + 1;
answer %= MOD;
}
cout << totalTime << endl << answer << endl;
}
return 0;
}
关键路径 p3 清华复试上机题的更多相关文章
- Twin Prime Conjecture(浙大计算机研究生保研复试上机考试-2011年)
Twin Prime Conjecture Time Limit: 2000/1000 MS (Java/Othe ...
- HDU 1234 (浙大计算机研究生复试上机考试-2005年) 开门人和关门人 (水)
开门人和关门人 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- ZOJ问题(2010浙江大学研究生复试上机题目[找规律] hdoj 3788)
ZOJ问题 pid=3788">点击打开链接 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- Java上机题(封装)(编写student类)
今天帮大一的童鞋写Java上机题 题目虽然很简单,但是刚拿到题目的时候愣了一下,然后就疯狂get set QuQ 其实这是一个特别基本的封装的题目(之前实验室面试大二的时候竟然还有蛮多人不知道封装的概 ...
- Python语言上机题实现方法(持续更新...)
Python语言上机题实现方法(持续更新...) 1.[字符串循环左移]给定一个字符串S,要求把S的前k个字符移动到S的尾部,如把字符串"abcdef"前面的2个字符'a'.'b' ...
- Java 哈希表(google 公司的上机题)
1 哈希表(散列)-Google 上机题 1) 看一个实际需求,google 公司的一个上机题: 2) 有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址..),当输入该 ...
- 九度OJ1486 /POJ 1029/2012北京大学研究生复试上机
wa到死!wa到死!这是一个看着简单,坑及其多的题! 坑一:POJ上是单组输入,九度上是多组输入,妈蛋要是研究生复试遇到这种大坑肯定死掉啊!而且对于codeforces比较习惯的 同学肯定会觉得巨坑无 ...
- 华为上机题汇总----java
以下华为上机题目都是网上整理得到的,代码都是自己调试过的,由于网上java答案较少,欢迎大家批评指正,也希望对准备华为上机的童鞋们有一点点帮助.在练习的过程中成长,加油!~~ 第1题:输入字 ...
- 浙江大学PAT上机题解析之1014. 福尔摩斯的约会 (20)
1014. 福尔摩斯的约会 (20) 时间限制 50 ms 内存限制 32000 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Y ...
随机推荐
- vue解决音频可视化播放,使用wavesurfer.js
vue解决音频可视化播放,使用wavesurfer.js 上效果: 1.安装wavesurfer npm install wavesurfer.js 2.在页面导入 import WaveSur ...
- python---括号匹配
""" 括号匹配 输入: "()[]{}" 输出true 输入:"([)]" 输出false 输入:")(()))&qu ...
- python---用顺序表实现双端队列
class Dqueue(object): """双端队列""" def __init__(self): self.__list = [] ...
- 根据官方文档使用Visual Studio Code创建代码组件的一些总结
1.安装组件Visual Studio Code Download Visual Studio Code - Mac, Linux, Windows 2.安装Node.js Download | No ...
- Git原理学习记录
Git原理学习记录 1.git init git-test git init 实际上就是在特定的目录下创建对应的目录和文件 2.object $ echo "V1" > ...
- Blazor 使用拖放(drag and drop)上传文件
在很多上传文件的应用实例中, 都可以看到[拖放文件到此上传]这种骚功能 ,今天我们就来试试Blazor能不能完成这个想法. 简述HTML5拖放 拖放是HTML5标准的一部分,任何元素都能够拖放,也能够 ...
- NodeJs学习日报——day3
// 导入模块 const http = require('http') // 创建web服务器实例 const server = http.createServer() // 为服务器实例绑定req ...
- Fabric2.2中的Raft共识模块源码分析
引言 Hyperledger Fabric是当前比较流行的一种联盟链系统,它隶属于Linux基金会在2015年创建的超级账本项目且是这个项目最重要的一个子项目.目前,与Hyperledger的另外几个 ...
- 如何在Web前端实现CAD图文字全文搜索功能之技术分享
现状 在CAD看图过程中我们经常会需要用到查找文字的功能,在AutoCAD软件查找一个文字时,可以通过打开左下角输入命令find,输入查找的文字,然后设置查找范围,就可以搜索到需要查询的文字.但在We ...
- XCTF练习题---MISC---base÷64
XCTF练习题---MISC---base÷64 flag:flag{E33B7FD8A3B841CA9699EDDBA24B60AA} 解题步骤: 1.观察题目,下载附件 2.打开附件,观察内容和题 ...