#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 的有向边 (ABA \to B)。 那么,整个编纂任务就构成了一个有向图

  • 有向无环图 (DAG):为了保证任务能完成,图中不能存在(例如:A依赖B,B依赖C,C又依赖A,这样谁都无法开始)。
  • 拓扑排序:将图中的所有节点排成一个线性序列,使得对于图中任意一条有向边 uvu \to v,节点 uu 在序列中都出现在节点 vv 之前。
    • 这个序列就是合理的工序安排
    • 层级计算:如果我们可以同时安排多人并行工作,那么所有“当前没有依赖”的任务可以同时进行。这类似于在 DAG 上进行 BFS 分层。

第二部分:题目内容

题目名称:大典的编纂 (Compiling the Grand Encyclopedia)

题目描述

大才子解缙担任了《永乐大典》的总编纂官。他将全书划分为了 NN 个卷册,编号为 11NN。 由于内容之间存在引用关系,这 NN 个卷册之间存在 MM 条依赖限制。 第 ii 条限制描述为:卷册 uiu_i 必须在卷册 viv_i 之前 编写完成(即 uiu_iviv_i 的前置基础)。

为了加快进度,朝廷召集了无数翰林院学士。我们假设人手是充足的,即:只要一个卷册的所有前置依赖都已完成,就可以立刻安排人手开始编写该卷册。 编写每一卷册都需要消耗 1个单位时间(例如1个月)。可以有多个卷册在同一时间段内并行编写。

现在,解缙把整理好的依赖关系交给了你,请你帮忙计算:

  1. 是否存在矛盾的依赖关系(即是否存在循环依赖,导致永远无法完成)?
  2. 如果可以完成,最少需要多少个单位时间才能编纂完所有卷册?

输入格式

第一行包含两个正整数 N,MN, M

  • NN 表示卷册数量。
  • MM 表示依赖关系的数量。

接下来 MM 行,每行包含两个正整数 u,vu, v,表示 uu 必须在 vv 之前完成(uvu \to v)。

输出格式

输出一行。

  • 如果无法完成所有卷册(存在环),输出 -1
  • 否则,输出完成所有卷册所需的最少单位时间。

输入输出样例 #1

输入:

5 4
1 2
1 3
2 4
3 5

输出:

3

样例 #1 解释:

  • 依赖关系:121 \to 2, 131 \to 3, 242 \to 4, 353 \to 5
  • 第 1 轮:只有卷册 1 没有前置依赖。编写 1。耗时 1。
    • 1 完成后,2 和 3 的依赖解除。
  • 第 2 轮:2 和 3 都可以开始了。并行编写 2 和 3。耗时 1。
    • 2 完成后,4 解锁;3 完成后,5 解锁。
  • 第 3 轮:4 和 5 都可以开始了。并行编写 4 和 5。耗时 1。
  • 总耗时1+1+1=31 + 1 + 1 = 3

输入输出样例 #2

输入:

3 3
1 2
2 3
3 1

输出:

-1

样例 #2 解释: 12311 \to 2 \to 3 \to 1。形成了环,谁都无法开始第一步。

数据范围

对于 100%100\% 的数据:

  • 1N1051 \le N \le 10^5
  • 1M2×1051 \le M \le 2 \times 10^5
  • 1u,vN1 \le u, v \le N