#19292. 永乐大典的编纂
永乐大典的编纂
你好!我是你的OI金牌教练。
在上一道题中,我们通过“秦始皇统一六国”的背景,学习了并查集,它主要用于解决无向图中的集合合并与连通性判断问题。
今天,我们将时间轴拨到明朝,结合中国古代最大的百科全书——《永乐大典》的编纂过程,来学习有向图 (Directed Graph) 中的一个核心算法——拓扑排序 (Topological Sort)。
这道题在知识点上与上一题有明显的递进关系:从处理“无向、无序”的集合关系,进阶到处理“有向、有序”的依赖关系。这是 GESP 6级及以上必须掌握的图论算法。
第一部分:背景知识讲解
1. 永乐大典 (Yongle Encyclopedia)
明朝永乐元年(1403年),明成祖朱棣下令解缙等人编纂一部集中国古代典籍于大成的类书。这部书定名为《永乐大典》,全书22,937卷,11,095册,约3.7亿字,是世界历史上规模最大的百科全书。
2. 编纂的逻辑(依赖关系)
编纂如此浩大的工程,必须有严密的逻辑顺序。很多卷册的内容是相互关联的。 例如:
- 在编写“地理卷”之前,必须先整理好“州县方志”。
- 在编写“礼制卷”之前,必须先考证“先秦古籍”。 这种 “A 必须在 B 之前完成”的关系,在计算机科学中被称为依赖关系 (Dependency)。
3. 算法模型:DAG 与 拓扑排序
如果我们把每一本书看作图中的一个节点,把“书 A 是 书 B 的参考资料(A必须先写)”看作一条从 A 指向 B 的有向边 ()。 那么,整个编纂任务就构成了一个有向图。
- 有向无环图 (DAG):为了保证任务能完成,图中不能存在环(例如:A依赖B,B依赖C,C又依赖A,这样谁都无法开始)。
- 拓扑排序:将图中的所有节点排成一个线性序列,使得对于图中任意一条有向边 ,节点 在序列中都出现在节点 之前。
- 这个序列就是合理的工序安排。
- 层级计算:如果我们可以同时安排多人并行工作,那么所有“当前没有依赖”的任务可以同时进行。这类似于在 DAG 上进行 BFS 分层。
第二部分:题目内容
题目名称:大典的编纂 (Compiling the Grand Encyclopedia)
题目描述
大才子解缙担任了《永乐大典》的总编纂官。他将全书划分为了 个卷册,编号为 到 。 由于内容之间存在引用关系,这 个卷册之间存在 条依赖限制。 第 条限制描述为:卷册 必须在卷册 之前 编写完成(即 是 的前置基础)。
为了加快进度,朝廷召集了无数翰林院学士。我们假设人手是充足的,即:只要一个卷册的所有前置依赖都已完成,就可以立刻安排人手开始编写该卷册。 编写每一卷册都需要消耗 1个单位时间(例如1个月)。可以有多个卷册在同一时间段内并行编写。
现在,解缙把整理好的依赖关系交给了你,请你帮忙计算:
- 是否存在矛盾的依赖关系(即是否存在循环依赖,导致永远无法完成)?
- 如果可以完成,最少需要多少个单位时间才能编纂完所有卷册?
输入格式
第一行包含两个正整数 。
- 表示卷册数量。
- 表示依赖关系的数量。
接下来 行,每行包含两个正整数 ,表示 必须在 之前完成()。
输出格式
输出一行。
- 如果无法完成所有卷册(存在环),输出
-1。 - 否则,输出完成所有卷册所需的最少单位时间。
输入输出样例 #1
输入:
5 4
1 2
1 3
2 4
3 5
输出:
3
样例 #1 解释:
- 依赖关系:, , , 。
- 第 1 轮:只有卷册 1 没有前置依赖。编写 1。耗时 1。
- 1 完成后,2 和 3 的依赖解除。
- 第 2 轮:2 和 3 都可以开始了。并行编写 2 和 3。耗时 1。
- 2 完成后,4 解锁;3 完成后,5 解锁。
- 第 3 轮:4 和 5 都可以开始了。并行编写 4 和 5。耗时 1。
- 总耗时:。
输入输出样例 #2
输入:
3 3
1 2
2 3
3 1
输出:
-1
样例 #2 解释: 。形成了环,谁都无法开始第一步。
数据范围
对于 的数据: