【题目描述】
John的农场在给奶牛挤奶前有很多杂务要完成,每一项杂务都需要一定的时间来完成它。比如:他们要将奶牛集合起来,将他们赶进牛棚,为奶牛清洗乳房以及一些其它工作。尽早将所有杂务完成是必要的,因为这样才有更多时间挤出更多的牛奶。当然,有些杂务必须在另一些杂务完成的情况下才能进行。比如:只有将奶牛赶进牛棚才能开始为它清洗乳房,还有在未给奶牛清洗乳房之前不能挤奶。我们把这些工作称为完成本项工作的准备工作。至少有一项杂务不要求有准备工作,这个可以最早着手完成的工作,标记为杂务 1 1 1。John有需要完成的 n n n个杂务的清单,并且这份清单是有一定顺序的,杂务 k ( k > 1 ) k(k>1) k(k>1)的准备工作只可能在杂务 1 1 1至 k − 1 k−1 k−1中。
写一个程序从 1 1 1到 n n n读入每个杂务的工作说明。计算出所有杂务都被完成的最短时间。当然互相没有关系的杂务可以同时工作,并且,你可以假定John的农场有足够多的工人来同时完成任意多项任务。

【输入格式】
第 1 1 1行:一个整数 n n n,必须完成的杂务的数目 ( 3 ≤ n ≤ 10 , 000 ) (3 \le n \le 10,000) (3≤n≤10,000);
第 2 2 2至 ( n + 1 ) (n+1) (n+1)行:共有 n n n行,每行有一些用 1 1 1个空格隔开的整数,分别表示:

  • 工作序号( 1 1 1至 n n n,在输入文件中是有序的);
  • 完成工作所需要的时间 l e n ( 1 ≤ l e n ≤ 100 ) len(1 \le len \le 100) len(1≤len≤100);
  • 一些必须完成的准备工作,总数不超过 100 100 100个,由一个数字 0 0 0结束。有些杂务没有需要准备的工作只描述一个单独的 0 0 0,整个输入文件中不会出现多余的空格。

【输出格式】
一个整数,表示完成所有杂务所需的最短时间。

【输入样例】

7
1 5 0
2 2 1 0
3 3 2 0
4 6 1 0
5 1 2 4 0
6 8 2 4 0
7 4 3 5 6 0

【输出样例】

23

【分析】


①DP分析
因为任务可以并发,所以一个任务如果有前驱的话,最优方案便是在它的最晚一个前驱结束后就立即开始,而且任务 k k k的前驱节点一定小于 k k k,所以读入时顺便从它的前驱里挑一个最大的转移即可。同时可以更新最终答案。


②拓扑排序分析
我们设 w [ i ] w[i] w[i]表示第 i i i个杂务所需的时间, t w [ i ] tw[i] tw[i]表示第 i i i个杂务的最早完成时间, p r e pre pre表示该杂务的前驱结点,则 t w [ i ] = m a x { t w [ p r e ] } + w [ i ] tw[i]=max\left\{ tw[pre]\right\}+w[i] tw[i]=max{tw[pre]}+w[i],最后求出每个杂务最早完成时间中的最大值即为完成所有杂务的最早时间 r e s = m a x { t w [ i ] } res=max\left\{ tw[i]\right\} res=max{tw[i]}。


【DP代码】

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;const int N = 10010;
int last[N], res;//last[i]为杂务i的最早完成时间
int n;int main()
{cin >> n;for (int i = 1; i <= n; i++){int t, pre, s = 0;cin >> i >> t;while (cin >> pre, pre) s = max(s, last[pre]);//求出最迟完成的前驱last[i] = s + t;//最迟前驱一完成后立刻开始杂务ires = max(res, last[i]);//所有杂务最早完成时间的最大值即为答案}cout << res << endl;return 0;
}

【拓扑排序代码】

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;const int N = 10010, M = 1000010;
int e[M], ne[M], h[N], idx;
int w[N], in[N], tw[N], res;
int n;void add(int u, int v)
{e[idx] = v, ne[idx] = h[u], h[u] = idx++;
}void topSort()
{queue<int> Q;for (int i = 1; i <= n; i++)if (!in[i]) Q.push(i), tw[i] = w[i];//没有前驱结点的杂务的最早完成时间即完成他自身的时间while (Q.size()){auto t = Q.front();Q.pop();res = max(res, tw[t]);//在队列中的结点的最早完成时间一定已经更新完成了for (int i = h[t]; ~i; i = ne[i])if (!--in[e[i]]) Q.push(e[i]), tw[e[i]] = max(tw[e[i]], w[e[i]] + tw[t]);else tw[e[i]] = max(tw[e[i]], w[e[i]] + tw[t]);}
}int main()
{cin >> n;memset(h, -1, sizeof h);for (int i = 1; i <= n; i++){cin >> i >> w[i];int x;while (cin >> x, x) add(x, i), in[i]++;}topSort();cout << res << endl;return 0;
}

洛谷P1113 杂务(DP,拓扑排序)相关推荐

  1. P3387 【模板】缩点 洛谷 java题解 连通图+拓扑排序

    传送门: P3387 [模板]缩点 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P3387 问题分析 首先为了节省 ...

  2. 洛谷P1983 车站分级 拓扑排序

    题目链接:https://www.luogu.com.cn/problem/P1983 此题是用拓扑排序求层数,将等级高的点连向等级的点,连成的图用拓扑排序看一下多少层,即答案. 代码如下 #incl ...

  3. 拓扑排序——杂物(洛谷 P1113)

    题目选自洛谷P1113 把每个任务看作一个结点,如果两个任务x和y满足x是y的准备工作,那么在x和y之间连一条有向边. 由于互相没有关系的杂物可以同时工作,所以可以发现所有杂物都被完成的最短时间只取决 ...

  4. 洛谷P3953 逛公园(dp 拓扑排序)

    题意 题目链接 Sol 去年考NOIP的时候我好像连最短路计数都不会啊qwq.. 首先不难想到一个思路,\(f[i][j]\)表示到第\(i\)个节点,与最短路之差长度为\(j\)的路径的方案数 首先 ...

  5. BZOJ4011:[HNOI2015]落忆枫音(DP,拓扑排序)

    Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出这样一个问题.  「相信吧.不然我们是什么,一团肉吗?要不是有灵魂--我们也 ...

  6. 【洛谷试炼场】普及练习场——排序Ex

    题目 1.P1583魔法照片 排序 题目链接· 蒟蒻题解 2.P1051谁拿了最多奖学金[NOIP2005T1] 排序 题目链接 蒟蒻题解 3.P1093奖学金[NOIP2007普及] 排序 题目链接 ...

  7. [SHOI2003]吃豆豆(dp+拓扑排序)

    [SHOI2003]吃豆豆 蒟蒻的 第一篇blog,请各位大犇多多指正 题目描述 两个PACMAN吃豆豆.一开始的时候,PACMAN都在坐标原点的左下方,豆豆都在右上方.PACMAN走到豆豆处就会吃掉 ...

  8. 洛谷1846 游戏 dp

    题目链接 题意: 给定两个正整数数列,你要用它们来做一个游戏:你需要对数列进行若干次操作,每一次操作,应选择两个正整数K1和K2 ,并删除第一个数列的最后K1个数,计算出它们的和S1:删除第二个数列的 ...

  9. 洛谷P3146 区间dp做题笔记

    不是题解,不是题解,不是题解,纯属个人笔记,不知所言. 传送门:P3146 问:什么时候才能写的一手漂亮的dp? 答:夜深人静之时,魂归故里之日. 此题是一道基础的区间dp的题,看完题解犹豫片刻,之后 ...

最新文章

  1. VirtualBox虚拟机安装RedHat7.3编译Linux0.01内核
  2. Android内存优化(三)避免可控的内存泄漏
  3. QT实现音乐的大小可视化为动画条
  4. BZOJ1565:[NOI2009]植物大战僵尸——题解
  5. 安装qtceator后无法启动help插件 Qt编译错误:cannot find -lGL 解决办法
  6. 浅谈SQL Server identity列的操作方法
  7. Iplimage设置感兴趣区域(ROI)
  8. 解决libc.so.6: version `GLIBC_2.14#39; not found问题
  9. Adobe Flash Builder 4 序列号
  10. kindle paperwhite3 拆机越狱
  11. 活动预约报名小程序已优化点与待优化点
  12. 机器学习算法 07 —— 朴素贝叶斯算法(拉普拉斯平滑系数、商品评论情感分析案例)
  13. 计算机并行配置,windows10无法启动应用程序提示并行配置不正确解决方法
  14. 高精度信号链电路精密模拟器件双轨供电方案
  15. AUTOCAD——弧形文字排列
  16. 写给青春,写给军乐团
  17. matlab教程 振动,Matlab振动程序-代码作业
  18. 永久消除自动产生的QQPCMgr
  19. 下载并安装 Node
  20. dnf锁定计算机,DNF老电脑福音 教你如何提升游戏流畅度

热门文章

  1. 2021-05-03扫雷游戏
  2. 高考全国卷一计算机应用考题,高考改革新动态!编程题竟然出现在高考全国卷...
  3. 计算机运算法则图鉴,在西航 | 脑洞大开!四则运算的西航生活图鉴,各类等式出乎意料……...
  4. 一个简单粗暴的营销方案,让麻辣烫老店业绩增长40倍以上!
  5. linux上原生程序运行QQ,微信,百度网盘,王者荣耀,cf
  6. 大数据可视化系列一:可视化工具选择
  7. 使用edge浏览器,白嫖ChatGPT的保姆级教程来了
  8. 实训笔记:Flume基础 Mac 安装Flume
  9. java c3po_17、C3PO纯java使用
  10. 率土之滨服务器维护需要多久,率土之滨赛季多久一次,赛季更新维护需要多久...