3 solutions
-
0
题面描述:
给定一组元素及其依赖关系,其中一个元素可以依赖多个其他元素,且一个元素也可以被多个其他元素所依赖。在输入中,首先给出依赖关系的数量,接着每行描述一个元素及其依赖的元素。任务是输出唯一存在的循环依赖,从最小的元素编号开始,依次输出依赖关系,最后以该最小元素结束。通过分析依赖关系,可以确定循环依赖的路径。
思路
简化题意:给出若干条边组成的有向图,找出其中唯一的环,保证环一定存在。 直接 dfs ,遍历完点 u 还未找到环,则说明点 u 不在这个环上。 当某个点已经被遍历过一次,且在 dfs 过程中再次被遍历过,说明遍历完了一整个环。 具体实现上使用一个栈来存储 dfs 过程中遍历到的点,如果一个点 u 被遍历到了两次,则说明找到了这个环,且 u 是这个环上的点。 只需要依次弹出栈中的点,直至弹出 u 为止,这就是环中所有的点。 需要注意的是:
- 弹出栈中的点获得的是一个倒序的环,需要反转一下
- 如果一个点在遍历完毕后仍然未结束,说明这个点不在环上,需要从栈中弹出
时间复杂度:O(m), m 为所有的边的数量
题解
题目要求在给定的有向图中寻找唯一的环。我们可以通过深度优先搜索(DFS)的方法来实现这个目标。具体的步骤如下:
-
数据结构:
- 使用邻接表存储图的边,
h
表示每个节点的邻接边的头部,e
表示边的目标节点,nxt
用于存储每条边的下一条边的索引。 vis
数组用于标记每个节点是否已经被访问。onpath
数组用于标记当前 DFS 路径上的节点,以帮助识别环的存在。path
数组用于记录当前 DFS 路径上的节点顺序。cyc
数组用于存储找到的环,nc
记录环中节点的数量。
- 使用邻接表存储图的边,
-
DFS 遍历:
- 在 DFS 中,首先检查当前节点是否在
onpath
中。如果是,则说明找到了一个环,并记录环的路径。 - 如果当前节点已经被访问过(即在
vis
中标记为 1),则直接返回,避免重复搜索。 - 将当前节点添加到路径中,继续 DFS 遍历其所有邻接节点。
- 在 DFS 中,首先检查当前节点是否在
-
环的输出:
- 找到环后,从栈中弹出节点并记录,直到再次弹出起始节点,形成环。
- 由于弹出的顺序是倒序的,因此需要在输出之前对环进行反转。
- 最后输出环中的节点,并以最小的节点作为结尾。
-
复杂度:
- 整个算法的时间复杂度为 O(m),其中 m 为图中的边数。
AC代码
- java
- python
c++
- 1
Information
- ID
- 81
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 7
- Tags
- # Submissions
- 183
- Accepted
- 42
- Uploaded By