Python中检测有向图中的循环2025 年 1 月 5 日 | 阅读 9 分钟 在此问题中,我们将给定一个有向图。我们的任务是判断有向图是否包含构成环的路径。 让我们看一个有向图的例子 输入: V = 8, E = 9 1 → 2 → 3 → 4 â á á â 5 → 6 7 ß 8 输出: 是 在这个图中,似乎存在两个环。然而,只有一个环。节点 1、5、6 和 2 之间看似的环并不在同一条路径上。1 和 2 的路径方向不同。图中唯一的环是节点 3、4、8 和 7 形成的环。所有节点都在同一条路径上。 输入: N = 4, E = 4 1 → 2 â á 5 → 6 输出: 是 这个图没有任何环。 方法 - 1首先,我们将使用深度优先搜索或 DFS 算法来解决这个问题。 与无向图的 DFS 算法不同,仅凭父节点无法判断是否存在环。原因是父节点应该在同一条路径上,而节点本身无法确认这一点。 例如,在这个图中: 1 → 2 → 3 → 4 â á á â 5 → 6 7 ß 8 节点 2 将被访问。第一次访问 2 时,其父节点为 1。第二次,通过节点 6 访问 2;6 的父节点是 5,不等于 2,这表明存在环。但是,2 和 1 和 6 不在同一条路径上。 因此,这里的主要问题在于路径。 为了维护路径检查,我们将创建另一个数组,该数组将记录当前节点是否已在当前路径中被访问。一旦路径完成,路径访问数组中的节点将使用回溯技术设置为 False 或 0。 这将确保只有当一个节点在同一条路径上被重新访问时,算法才会返回 True 表示存在环。如果访问的节点在不同的路径上,它们将不被视为环的一部分。 现在让我们看看这个算法。 算法请按照以下步骤来实现这个想法
下面是 DFS 算法的 Python 程序。 代码 输出 The graph has a cycle 方法 - 2在此方法中,我们将使用 Kahn 算法来检测有向图中的环。我们将在此算法中使用 BFS 遍历。 Kahn 算法常用于拓扑排序。在拓扑排序中,我们将有向无环图的顶点从 A 排列到 B,以便 A 始终出现在 B 之前。实现 Kahn 算法的第一步是找到每个顶点的入度。入度是指指向目标顶点的边的数量。我们通过创建一个初始入度计数为 0 的数组来实现这一点。然后,我们将遍历邻接列表中的每条边,并为每个顶点增加入度计数。 入度为 0 的节点将从图中移除并添加到已排序列表中。然后,我们运行一个 while 循环,并将零入度的顶点添加到已排序列表中。 在 Kahn 算法中,第一步是找到所有不依赖于其他节点的节点。指向该节点的其他图节点数为零的节点被认为是零依赖。这些节点具有零入度。我们将从零入度节点开始执行 BFS 遍历。在 BFS 遍历的每次迭代中,我们将减少相邻节点的入度计数,并继续将零入度的节点添加到队列中。 为了可视化解决方案,我们可以将其理解为不断移除没有依赖的节点。这样,问题就会简化为一个更小的问题。图会不断变小,从而简化问题。但是,要消除一个节点,我们也必须更新其相邻节点的依赖性。我们将减少这些相邻节点的入度,并检查它们的依赖性是否减少到零。一旦所有零入度节点都被遍历,我们将检查是否还有具有大于零入度的节点。如果存在这样的节点,则表示图中包含环。 让我们来理解一下这个方法
说明 Graph 类已在以下代码中实现,并且图表示为邻接列表。此外,还定义了一个名为 isCyclic 的方法,该方法执行图的 BFS 遍历来查找环。在将零入度的顶点入队之前,isCyclic 函数会确定每个顶点的入度。然后,它会移除零入度的顶点并降低其相邻顶点的入度。任何入度为零的相邻顶点都会被入队。如果不是所有顶点都已访问,表明存在环,则该方法返回 true 并跟踪已访问顶点的数量。 代码 输出 The graph has a cycle 时间复杂度: 我们遍历了总的顶点数和边数。因此,时间复杂度为 O(V + E)。 空间复杂度: 我们创建了一个数组来存储已访问的节点。因此,空间复杂度为 O(V)。 |
引言 在 Python 中,文本中相邻的词对称为 bigrams。自然语言处理任务经常使用文本评估、情感分析和设备翻译。使用 spaCy 和 NLTK (Natural Language...) 等工具,在 Python 中创建 bigrams 非常容易...
阅读 3 分钟
介绍 Python Imaging Library (PIL) 是一个用于 Python 中图像处理任务的强大库。在其众多功能中,Image.open() 方法是加载图像到内存中的基本函数。本文将深入探讨 Image.open() 方法的复杂性,...
阅读 3 分钟
Biopython 中的 Motif 对象简介 Biopython 中的 Motif 对象提供了一个有效的框架来操作生物序列基序。基因调控、蛋白质结构和进化联系的研究依赖于这些基序,它们是 DNA、RNA 或...
5 分钟阅读
简介 数据科学和机器学习领域经常包含需要妥善处理的分类数据,例如非数值。数据预处理的职责,例如在模型或分析中使用前将分类数据转换为数值格式,相当...
阅读 10 分钟
? 简介 Python 的 Unicode (UTF-8) 读取和写入功能处理以支持多种语言和字符的格式编码的文本。一种适用于许多设备和系统的流行 Unicode 编码标准是 UTF-8。使用 Python 的 open() 方法和...
阅读 4 分钟
? Python 和 C 是两种知名的编程语言,具有独特的属性和优势。Python 以其简洁、可读性和高级抽象而闻名,使其成为快速开发和原型设计的绝佳选择。另一方面,C 以其速度而著称...
阅读 6 分钟
上采样,也称为图像缩放或调整大小,是图像处理中的一个基本步骤,它增加了图像的分辨率。该方法常用于各种应用,包括数字缩放、图像增强以及机器学习模型的预处理。OpenCV(开源计算机视觉...
阅读 3 分钟
Python中的“requests”包通常用于创建HTTP请求。它提供了一种简单且有吸引力的方式来与在线服务和API接口。Session对象是“requests”库最强大的功能之一。Session对象允许您保存...
阅读 4 分钟
简介 在繁忙的技术世界中,截屏已成为大多数应用程序和项目的重要组成部分。功能多样的 Python 编程语言提供了各种强大的工具和库来管理许多不同类型的任务,包括截屏。在这篇详细的….
阅读 4 分钟
Python 中的 TLS/SSL 简介 TLS (Transport Layer Security) 和 SSL (Secure Sockets Layer) 是用于保护网络通信安全的加密协议。在 Python 中,`ssl` 模块实现了这些协议,提供了创建安全连接的功能。通过包装套接字,开发人员可以...
阅读 3 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India