首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用非递归dfs检测有向图中的圈

非递归深度优先搜索(Non-recursive Depth First Search,非递归DFS)是一种用于检测有向图中是否存在环的算法。该算法通过模拟递归的方法,遍历图中的节点,并检测是否存在后向边(back edge),若存在后向边则说明图中存在环。

算法步骤如下:

  1. 创建一个栈,并将起始节点入栈。
  2. 创建一个集合visited,用于记录已经访问过的节点。
  3. 进入循环,直到栈为空。
    • 从栈顶取出一个节点,记为current。
    • 如果current未被访问过,则将其标记为visited,并将其所有未访问过的邻居节点入栈。
    • 如果current已被访问过,则检查current与其邻居节点的关系,如果存在后向边,则图中存在环。
  • 如果循环结束时都没有检测到环,则图中不存在环。

非递归DFS的优势是避免了递归带来的函数调用开销,节省了内存空间。该算法适用于大规模有向图的环检测,并且可以通过合理的数据结构和算法优化来提高效率。

非递归DFS在实际应用中可以用于拓扑排序、寻找强连通分量等场景。在云计算领域,可以应用于任务调度、依赖关系管理等问题的解决。

腾讯云提供了云计算相关的产品和服务,例如:

  • 云服务器(CVM):提供弹性的计算能力,用于搭建应用程序、服务和网站。
  • 云数据库 MySQL 版(CDB):可扩展的关系型数据库服务,用于存储和管理数据。
  • 人工智能机器学习平台(AI Lab):提供一系列机器学习和深度学习的工具和服务。
  • 云存储(COS):提供安全可靠的对象存储服务,用于存储和管理海量数据。
  • 云函数(SCF):无服务器计算服务,用于编写和运行无需管理服务器的代码。
  • 云原生容器服务(TKE):为应用程序提供容器化部署和管理的平台。

更多腾讯云产品和详细介绍可以参考腾讯云官方网站:https://cloud.tencent.com/。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

图论整理 顶

而类似于下图的图是有方向的 ? 我们称之为有向图(Directed Graph),在有向图中,只能够从起始顶点出发到达方向末端的相邻顶点,相反则不可以。...在无向图中,一个顶点的度(degree),就是这个顶点相邻的边数,这里也是在说简单图,不考虑自环边和平行边。但在一个有向图中,一个顶点的度的概念不同。...所以我们可以看到下图中0这个顶点有两个邻边0-1、0-3,所以0这个顶点的度就是2. 无权无向图的邻接矩阵 ? ?...时间复杂度 O(V + E) 无权无向图的非递归深度优先遍历 我们来看一下二分搜索树的非递归前序遍历 public void preOrderNR() {...无向图的环检测 当我们要判断一个图中是否有环的时候,不论这个图是否有多个联通分量。

73020

DFS(小白式超详细讲解以及代码讲解)

图的遍历算法是求解图的连通性,拓扑排序和关键路径等算法的基础。 根剧搜索路径的方向,通常有两条遍历图的路径: 深度优先搜索(DFS)和广度优先搜索(BFS)。 对于有向图和无向图都适用。...深度优先搜索遍历连通图 1)从图中某个顶点出发,访问v,并置visited[v]的值为true. 2) 依次检查v的所有的邻接点w,如果visited[w]的值为false,再从w出发进行递归遍历,...visited[w]) DFS(G,w);//对v尚未访问的邻接点w递归调用DFS; } 那么对于非连通图的遍历,我们可以看做是一个个连通分量,循环调用多少次,那么就有多少个连通分量。...用深度优先遍历非连通图 void DFS(Graph G){//对非连通图G做深度优先遍历 for(v = 0;v < G.num;++v) visited[v] = false;...,并写代码做题了 DFS算法思想:一直往深处走,直到找到解或者走不下去为止; 一般DFS使用栈保存未被检测的结点,结点深度优先的次序被访问并被依次压入栈中,并以相反的次序出栈进行新的检测。

61360
  • 垃圾收集 无向图的环检测:在无向图中,BFS或DFS可以用来检测循环。在有向图中,只有深度首先可以使用搜索。 在Ford-Fulkerson算法中,可以使用广度先或深度先遍历,找到最大流。...visited[*i]) DFS(*i, visited); } 应用 对于无权图,DFS可以生成最小生成树。 检测图中是否有循环。...查找给定节点uv之间是否有路径 拓扑排序 判断一个图是否可以二分 寻找图的强连通分量 迷宫问题 深度优先遍历的非递归实现 void DFS(int s, vector &visited) {...检测有向图中是否有环 ? 如在上图中,是存在0->2->0这样的环。3->3的环。当且仅当存在一条后向边才可以认为图中有环。...后向边(u,v)是指节点u连接到其在深度优先搜索树中的一个祖先节点v这样的一条边。3->3这样的自循环也可以认为是一条后向边。 为了检测图中的后向边,对DFS递归函数的中递归栈进行跟踪。

    1.8K10

    文心一言 VS 讯飞星火 VS chatgpt (322)-- 算法导论22.4 3题

    但标准的无向图环路检测算法(如基于 DFS 的方法)通常具有 O(V + E) 的时间复杂度。...不过,如果我们考虑一个特定的图结构,即并查集(Union-Find)在某些情况下可以用于检测图中的环(尽管这通常用于检测有向图中的环,特别是涉及强连通分量时),但在无向图中,我们可以利用它来检测一个特殊的图...的无向图环路检测算法,其时间复杂度为 O(V + E),但请注意,这仍然是目前在一般无向图中检测环路的最有效方法之一。...360智脑: 要在O(V)时间内检测无向图中的环,我们可以使用深度优先搜索(DFS)并记录每个节点的状态。由于我们希望算法的复杂度与边的数量|E|无关,这意味着我们不能直接检查每条边。...(DFS)来遍历图中的每个节点,并检查是否有已访问过的非父节点。

    7920

    【c++高阶DS】图的遍历

    访问标记的作用: 防止重复访问顶点,避免死循环。例如,在无向图中,访问 A 时会发现 B,然后访问 B 时会发现 A,没有标记的话会导致无限循环。...回溯策略:当某节点的所有邻居都被访问后,回溯到其上一个节点,继续探索其未访问的邻居。 递归实现或使用栈:DFS 可以通过递归或显式栈来实现。...非递归实现(使用栈) void DFS(Graph& graph, const V& start) { stack s; // 栈用于存储待访问的顶点...邻接矩阵表示: O(V^2) ,因为需要检查矩阵中的每一项。 空间复杂度: 栈或递归调用的深度为 O(V) 应用** 连通性检测: 判断无向图是否连通,或找到所有连通分量。...检测环: 深度优先遍历可以检测图中是否存在环。 拓扑排序: 用于有向无环图(DAG)的拓扑排序。 路径搜索: 找到从起点到终点的所有路径。

    6910

    环检测算法及拓扑排序(修订版)

    那么本文就结合具体的算法题,来说两个图论算法:有向图的环检测、拓扑排序算法。...这两个算法既可以用 DFS 思路解决,也可以用 BFS 思路解决,相对而言 BFS 解法从代码实现上看更简洁一些,但 DFS 解法有助于你进一步理解递归遍历数据结构的奥义。...看到依赖问题,首先想到的就是把问题转化成「有向图」这种数据结构,只要图中存在环,那就说明存在循环依赖。...很显然,如果一幅有向图中存在环,是无法进行拓扑排序的,因为肯定做不到所有箭头方向一致;反过来,如果一幅图是「有向无环图」,那么一定可以进行拓扑排序。 但是我们这道题和拓扑排序有什么关系呢?...环检测算法(BFS 版本) 刚才讲了用 DFS 算法利用 onPath 数组判断是否存在环;也讲了用 DFS 算法利用逆后序遍历进行拓扑排序。

    1.3K20

    数据结构——图

    [在这里插入图片描述] 连通图 - 无向图 - 图G中任意两个顶点之间都有路径相通 - 连通分量:若无向图为非连通图,则图中各个极大连通子图称作此图的连通分量。...- 有向图 - 强连通图:任意两个顶点之间都存在一条有向路径 - 强连通分量:极大强连通子图 [在这里插入图片描述] 极小连通子图: 该子图是G 的连通子图,在该子图中删除任何一条边,子图不再连通...visited[w]) DFS(G, w); // 如果w未访问,则递归调用DFS p = p->nextarc; // p指向下一个边结点 } } --- DFS算法效率分析 用邻接矩阵来表示图...广度优先搜索是一种分层的搜索过程,每向前走一步可能访问一批顶点,不像深度优先搜索那样有回退的情况。 因此,广度优先搜索不是一个递归的过程,其算法也不是递归的。...} } } 非连通图 /*------------广度优先非递归遍历连通图G(非连通图)------------*/ void BFSTraverse(Graph G){ for(v = 0; v

    83295

    leetcode 207. 课程表---拓扑排序篇一

    拓扑排序还可以用于检测一个有向图是否有环。相关的概念还有 AOV 网,这里就不展开了。 算法流程: 1、在开始排序前,扫描对应的存储空间(使用邻接表),将入度为 0 的结点放入队列。...2、只要队列非空,就从队首取出入度为 0 的结点,将这个结点输出到结果集中,并且将这个结点的所有邻接结点(它指向的结点)的入度减 1,在减 1 以后,如果这个被减 1 的结点的入度为 0 ,就继续入队。...---- DFS 原理是通过 DFS 判断图中是否有环。..., marked)) return false; } // 在遍历的过程中,一直 dfs 都没有遇到已经重复访问的结点,就表示有向图中没有环 // 所有课程任务可以完成,应该返回 true...for (auto gra : graph[i]) { // 层层递归返回 true ,表示图中存在环 if (dfs(gra, graph, marked)) return true

    61740

    leetcode 210. 课程表 II----拓扑排序篇二

    课程表—拓扑排序篇一上,增加了一个记录拓扑序列的功能,因此建议没有看前一篇的同学,先看前一篇,再来阅读本篇 ---- 拓扑排序—BFS 引言: 「拓扑排序」是专门应用于有向图的算法; 「拓扑排序」的结果不唯一...; 删除结点的操作,通过「入度数组」体现,这个技巧要掌握; 「拓扑排序」的一个附加效果是:能够顺带检测有向图中是否存在环,这个知识点非常重要,如果在面试的过程中遇到这个问题,要把这一点说出来。...2、只要队列非空,就从队首取出入度为 0 的结点,将这个结点输出到结果集中,并且将这个结点的所有邻接结点(它指向的结点)的入度减 1,在减 1 以后,如果这个被减 1 的结点的入度为 0 ,就继续入队。..., marked, res)) return vector(); } // 在遍历的过程中,一直 dfs 都没有遇到已经重复访问的结点,就表示有向图中没有环 // 所有课程任务可以完成...for (auto p : adj[i]) { // 层层递归返回 true ,表示图中存在环 if (dfs(p, adj, marked, res)) return true

    36250

    八十六、从拓扑排序探究有向图

    争哥把图比作成微信的好友关系,其实非常的形象。比如,上面图中的顶点都代表一个微信的用户。 整个微信的好友关系就可以用一张图来表示。...其实有向无环图也好理解的,“有向”指的是有方向,准确的说应该是同一个方向,“无环”则指够不成闭环,像上面例子的图。很多时候有向图,多指的是有向无环图。...这是不可能的。 这道题剥去包装的外衣后,其实是「有向图检测是否有环问题」,有环则代表修完全部课程不能实现。...当 queue 非空时,依次将队首节点出队,在课程安排图中删除此节点 pre: 但并不是真正从邻接表中删除此节点 pre,而是将此节点对应所有邻接节点 cur 的入度 -1,即 indegrees[cur...DFS的操作步骤如下(递归方式):1,初始化每个节点,令其访问标志为0 2,对初识节点调用DFS访问, 只要p不空即(即边表不空),如该节点没被访问过就递归调用DFS来访问,访问过以后标志记为1,否则p

    45510

    数据结构:图

    邻接矩阵法 所谓邻接矩阵存储,就是用一个一维数组存储图中顶点的信息,用一个二维数组存储图中边的信息(即各顶点之间的邻接关系)。...因此,在实际存储邻接矩阵时只需要存储上(或下)三角矩阵的元素即可 对于无向图,邻接矩阵的第i行(或第i列)非零元素的个数正好是第i个顶点的度;对于有向图,邻接矩阵的第i行(或第i列)非0元素的个数正好是第...但是,要确定图中有多少条边,则必须按行、按列对每个元素进行检测,所花费的时间代价很大。...image.png DFS算法是一个递归算法,需要借助一个递归工作栈,最坏情况下(一个竖排),它的空间复杂度为O(|V|)。...弗洛伊德算法同样也适用与带权无向边 关键路径 带权有向图中,以顶点表示事件,有向边表示活动,边上的权值表示完成该活动的开销,则称这种有向图为用边表示活动的网络,简称为AOE网。

    2K41

    【算法与图】通向高效解决方案的钥匙

    什么是 DFS? DFS(深度优先搜索)是一种图的遍历算法,从起始节点开始,尽可能深入探索每个分支,直到无法再继续,然后回溯到上一个节点,继续探索其他分支。它适用于有向图和无向图。 2....DFS 的基本步骤 起始节点:选择一个节点作为起点。 深入探索:访问起始节点,并标记为已访问。 递归访问:对当前节点的每个未访问邻居节点递归进行深度优先搜索。...非最短路径:与 BFS 不同,DFS 不保证找到最短路径,因为它按深度优先进行搜索。 应用广泛:DFS 可用于检测图的连通性、拓扑排序、寻找路径和检测环。 4....DFS 的应用 路径搜索:可以用于寻找图中从一个节点到另一个节点的路径。 图的连通性:判断图中的连通分量。 拓扑排序:用于有向无环图(DAG)的节点排序。 检测环:可以检测图中是否存在环。 5....算法步骤 克鲁斯卡尔算法的基本步骤如下: 排序边:将图中的所有边按权重从小到大排序。 初始化:创建一个空的生成树,并初始化一个并查集(Union-Find)结构,用于检测图中的环。

    24010

    算法细节系列(17):有向环检测&&拓扑排序

    有向环的检测问题是拓扑排序的基础问题,可以采用两种思路DFS&&BFS,DFS的想法很简单,先简单说说。...这是典型的无状态记录递归方法,而因为在一条DFS调用链上,我们得利用重复访问结点这个性质来检测有向环,所以把它带入到了DFS的参数列表中,比如我们DFS(V)时,紧接着DFS(W),在DFS(X),此时若没有有向环...那如何确保不存在有向环呢,用onStack去检测,它在递归返回时,会还原现场,当然得还原,否则就出现了第一个版本提到的问题,检测出错。一旦检测出有向环,整个函数返回。...除非DFS的运气很好,一眼看准了有向环,直接检测出来,但多少受限于数据输入分布。...理解了有向环的检测,拓扑排序就很容易实现了。

    71330

    白话解释 DFS 与 BFS 算法 (二叉树的先序遍历,中序遍历、后序遍历、层次遍历)

    3.2.1 先序遍历 递归实现先序遍历 非递归方式实现先序遍历 (栈) 3.2.2 中序遍历 递归实现中序遍历 非递归实现中序遍历 3.2.3 后序遍历 递归实现后续遍历 非递归实现后序遍历 一、二叉树的性质...从上面的图中我们可以分析出,二叉树每个节点至少是有一个数据域,然后还有两个子节点,所以可以构建出如下数据结构 数据结构用代码实现如下 public class TreeNode { int val;...DFS DFS 即深度优先搜索,同 BFS,在树和图中也是非常常见的。...= null) rightNode.frontShow(); } } 非递归方式实现先序遍历 (栈) 走完一遍递归的节点遍历方式,接下来我们走一遍非递归 的先序遍历。...答:我们使用递归可以解决的问题,那么就一定有非递归的方法解决问题,在上述的 “遍历过程中” ,有一个重要的点就是,当我们的一个节点访问到头了(这个节点没有子节点),就需要回溯 到上一个节点,然后完成剩下的遍历任务

    4.7K00

    LeetCode第207题--Course Schedule

    有向图数据结构 初始化时构造一张图,但只有顶点个事,顶点之间没有边相连。 用邻接表表示有向图。 调用addEdge()方法可以将课程之间先修关系写到图中。...} public Iterable adj(int v) { return adj[v]; } } 判断有向图中是否有环...用一个数组boolean[] onStack保存递归调用期间栈上的所有顶点. onStack[v]=true,记录顶点v出现在这次dfs中,在这次dfs结束后,是onStack[v]=false 在递归执行...dfs的过程中,记录当前下当前顶点在递归调用栈中,这样以后的递归调用栈只要判断它的相连点是否在之前的递归调用栈中出现过,就能判断是否有环。...顶点v是否在栈中 private boolean hasCycle; // 有向图中是否环 public DirectedCycle(Digraph G)

    70340

    判断有向图是否有圈

    虽然有圈图没有拓扑序列,但是我们可以利用拓扑排序的算法来判断一个有向图是否有圈。 算法描述如下: 1. 将所有入度为0的顶点放入队列; 2....否则,说明总     有顶点入度不为0,没有放入队列中,即该有向图有圈。...DFS 关于DFS的介绍请戳我,通过稍微修改DFS,利用递归的特点,也可以判断有向图是否有圈。...用如下样例模拟出递归过程帮助理解。 图解如下(好吧,画的有点丑,将就看吧(●'◡'●)): 样例一(有环): 3 3 1 2 2 3 3 1 ?...\n"); } return 0; }  上述利用DFS判断有向图是否有圈实际上是利用了深度优先生成树的性质:有向图无圈当且仅当其深度优先生成树没有回退边, 而上述算法中的vis[graph

    2.9K80

    文心一言 VS 讯飞星火 VS chatgpt (315)-- 算法导论22.3 7题

    七、请重写DFS算法的伪代码,以便使用栈来消除递归调用。如果要写代码,请用go语言。 文心一言: 使用栈来模拟深度优先搜索(DFS)的过程是一种典型的迭代方法,可以替代递归调用。...请注意,该实现中的DFS并不保证总是以相同的顺序访问节点,因为当你有多个未访问的邻接节点时,它们的访问顺序取决于它们在切片中的存储顺序,这可能会因Go运行时环境的不同而有所变化。...Graph包含了所有的顶点,而Vertex包含了顶点的ID、邻居列表和访问状态。我们使用一个切片作为栈来存储待访问的顶点,并在DFS函数中实现了非递归的深度优先搜索。 智谱清言: 当然可以。...天工: 使用栈来模拟深度优先搜索(DFS)可以避免递归调用的开销,尤其是在深度很大的图中,这可以防止栈溢出的问题。以下是使用栈来实现DFS算法的伪代码,以及相应的Go语言实现。...kimi: 深度优先搜索(DFS)算法是一种用于遍历或搜索树或图的算法。使用栈来实现非递归的DFS是一种常见的方法。以下是DFS的非递归伪代码,以及使用Go语言实现的代码示例。

    9520

    C++ 图论算法之欧拉路径、欧拉回路算法(一笔画完算法)

    欧拉图 本文从哥尼斯堡七桥的故事说起。 哥尼斯堡城有一条横贯全市的普雷格尔河,河中的两个岛与两岸用七座桥连结起来。当时那里的居民热衷于一个话题:怎样不重复地走遍七桥,最后回到出发点。...欧拉图的几个概念: 欧拉回路:指在图(无向图或有向图)中,经过图中所有边且只经过边一次所形成的回路,称为欧拉回路。具有欧拉回路的图称为欧拉图。...欧拉图的判定法: 无向图是欧拉图当且仅当:非零度顶点是连通的;顶点的度数都是偶数。 无向图是半欧拉图当且仅当:非零度顶点是连通的;恰有 2 个奇度顶点。...有向图是欧拉图当且仅当:非零度顶点是强连通的;每个顶点的入度和出度相等。...有向图是半欧拉图当且仅当:非零度顶点是弱连通的;至多一个顶点的出度与入度之差为 1;至多一个顶点的入度与出度之差为 1;其他顶点的入度和出度相等。 2.

    1.2K20
    领券