检测有向图中的循环17 Mar 2025 | 4 分钟阅读 在一个有向图中,我们将检查图是否包含环。有向图是一组通过边连接的顶点或节点,每条边都关联着某个方向。 考虑下面的有向图来检测环。 ![]() 现在,我们将使用DFS技术来检测有向图中的环。由于我们使用DFS技术,因此我们将使用栈数据结构进行实现。在这里,我们将使用一个标志变量,它包含三个值,即0、1和-1。其中,0表示节点已被访问并在栈中可用,-1表示节点未被访问,1表示节点已被访问并已从栈中弹出。 最初,所有顶点都标记为-1,因为它们都未被访问。 步骤1:首先,我们将访问顶点A并将其标记为0。由于节点A已被访问,因此它将被标记为0,并且节点A被推入栈中,如下所示 ![]() ![]() 已访问集合包含节点A,如下所示 已访问集合: A 父节点映射表如下所示 ![]() 由于节点A已被访问,A位于“顶点”列下,而“父节点”列留空,因为节点A是源顶点。 步骤2:下一个顶点是B。现在,我们将访问顶点B并将其标记为0。由于节点B已被访问,因此它将被标记为0,并且节点B被推入栈中,如下所示 ![]() ![]() 已访问节点包含节点A和B,如下所示 已访问集合: A,B 父节点映射表如下所示 ![]() 由于节点B已被访问,因此B位于“顶点”列下,而A位于“父节点”列下,因为B来自节点A。 步骤3:B的相邻顶点是C和D,这意味着我们可以访问C或D。假设我们访问顶点C,因此顶点C将被标记为0,并且节点C被推入栈中,如下所示 ![]() ![]() 现在,已访问集合包含节点A、B和C,如下所示 已访问集合:A,B,C 父节点映射表如下所示 ![]() 由于节点C已被访问,因此C位于“顶点”列下,而B位于“父节点”列下。 步骤4:C没有进一步的顶点可访问,因此我们将执行回溯。为了执行回溯,我们将弹出节点。首先,我们将节点C从栈中弹出。由于节点C已被弹出,因此我们将节点C标记为1,如下所示 ![]() 栈中下一个最顶层的节点是B,因此我们将回溯到顶点B,如下所示 步骤5:现在,我们将查看“是否有任何相邻顶点未被访问”。我们可以在上图中观察到顶点D未被访问。所以,现在我们将从顶点B移动到顶点D。顶点D的标志值现在变为0,并且顶点D被推入栈中,如下所示 ![]() ![]() 现在,已访问集合包含节点A、B、C、D 父节点映射表如下所示 ![]() 由于节点D已被访问,因此它位于“顶点”列下,并且节点D来自顶点B,因此顶点B位于“父节点”列下。 步骤6:节点D的相邻顶点是节点E,它尚未被访问。现在我们将访问顶点E并将其标志值标记为0。节点E被推入栈中,如下所示 ![]() ![]() 现在,已访问集合包含节点A、B、C、D、E。 父节点映射表如下所示 ![]() 由于节点E已被访问,因此它位于“顶点”列下,并且节点E来自顶点D,因此D位于“父节点”列下。 条件 有一个条件决定图是否包含环。如果任何顶点的相邻顶点具有0标志值,则表示图包含环。 在上图中,E的相邻顶点是B,其标志值为0;因此,图包含一个环。 现在我们将确定在图中创建环的节点。 E的相邻顶点是B; E->B E的父节点是D,所以; D->E->B D的父节点是B,所以, B->D->E->B(创建环) 下一主题最优二叉搜索树 |
在本课中,我们将学习如何查找两个已排序数组的相对补集。已排序数组是指已按指定顺序(字母、时间、顺序、基数顺序)组织的数组。未排序数组是指没有任何特定顺序的数组。让我们……
阅读 2 分钟
1962 年,GM Adelson-Velsky 和 EM Landis 创建了 AVL 树。为了纪念创建者,该树被称为 AVL。AVL 树的定义是高度平衡的二叉搜索树,其中每个节点都有一个平衡因子,该平衡因子由...
阅读 6 分钟
简介:在本文中,我们将介绍二叉索引树的范围更新和点查询。但在此之前,我们必须了解什么是二叉索引树。我们可以说二叉索引树是一种有助于我们...
阅读 8 分钟
引言 原地矩阵转置简介:矩阵转置是线性代数中的一个运算,涉及交换矩阵的行和列。在 \(m \times n\) 矩阵的上下文中,对其进行转置会得到一个 \(n \times m\) 矩阵。原地矩阵转置具体指的是...
阅读 4 分钟
二叉搜索树是一种二叉树数据结构,每个节点最多有两个子节点,分别指定为左子节点和右子节点。其左子树中的所有节点的值都小于节点的值。它们都大于节点的值...
阅读 4 分钟
本文探讨了删除超出指定范围的 BST 键的问题,并提供了一个 C 语言的实现。熟练掌握根据特定标准(如范围限制)操作 BST 对于各种应用至关重要,包括算法创建和...
阅读 4 分钟
引言 栈是软件工程和计算机科学中的基本数据结构。根据后进先出 (LIFO) 原则,栈是一个线性数据结构,最后添加到栈中的元素是第一个被移除的。尽管压栈...
阅读 4 分钟
什么是逆序数?逆序数概念用于数组,可以使用数组数据结构来执行。在逆序数中,我们将指定如何对数组进行排序。我们都需要找到一对元素,对于这些元素...
阅读 26 分钟
问题描述给定一个长度为 n 的 0 索引整数数组 nums 和一个整数 k,返回满足以下条件的对 (i, j) 的数量:0 <= i < j <= n - 1 且 nums[i] * nums[j] 可被 k 整除。Java 方法 1 频率计数 import java.util.Arrays; import java.util.HashMap; import...
阅读 6 分钟
引言 图论是一门重要的数学分支,它研究对象之间的成对关系。在图论中,有许多问题,其中之一是顶点覆盖问题。在计算机科学和组合优化中,顶点覆盖是一个经典问题,具有...
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India