这个问题与拓扑排序有关。
将每个作业视为图的一个节点。该方法的其余部分与顶级排序相同。
解决问题的步骤:
最初,每个节点的入度为 0。
现在根据给定的工作关系更改所有节点的入度。
现在从入度为 0 的节点运行 DFS 或 BFS。其余过程与拓扑排序相同。
让我们考虑您给定的输入。
1 -> 2
1 -> 5
2 -> 3
4 -> 2
4 -> 5
5 -> 6
度数[1] = 0
度数[2] = 2 ( 1->2, 4->2
)
度[3] = 1 ( 2->3
)
度[4] = 0
度[5] = 2 ( 1->2, 4->5
)
度[6] = 1 ( 5->6
)
如果我们首先从节点 1 运行 DFS,将其对应的节点标记为已完成,然后 1, 2, 3
将处理节点。作为这些节点之间的关系 ( 1->2->3
)。
注意:这里它处理的节点可以1, 5, 6
基于关系1->5->6
。它也会给出正确的答案。首先处理哪些节点,这取决于您制作邻接列表的方式。
然后4
将作为入度为 0 的未处理节点留下。因此,如果我们从 运行 DFS 4
, 4, 5, 6
则将被处理。作为这些节点之间的关系 ( 4->5->6
)。
所以你有你的答案,那就是2
。
注意:处理路径后,可以找到未处理且入度为 0 的新节点。例如,考虑关系1->2, 2->3
, 2->4
。
如果您首先处理路径1->2->3
,4
则将不进行处理。
如果您首先处理路径1->2->4
,3
则将不进行处理。
只需遵循基本的拓扑排序过程即可为您提供答案。您必须从多少度数为 0 的未处理节点中计算您正在运行 DFS。
了解拓扑排序的有用资源: