首页
学习
活动
专区
工具
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() {...无检测 当我们要判断一个图中是否时候,不论这个图是否多个联通分量。

72620

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使用栈保存未被检测结点,结点深度优先次序被访问并被依次压入栈中,并以相反次序出栈进行新检测

60160
  • 垃圾收集 无检测:在无图中,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)来遍历图中每个节点,并检查是否已访问过父节点。

    7520

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

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

    1.2K20

    数据结构——图

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

    80995

    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

    57240

    八十六、从拓扑排序探究

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

    44510

    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

    35750

    数据结构:图

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

    1.9K41

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

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

    10210

    遍历(上)——邻接矩阵表示

    ---- 广度优先遍历(BFS) BFS 算法思想是:对一个无连通图,在访问图中某一起始顶点 v 后,由 v 出发,依次访问 v 所有未访问过邻接顶点 w1, w2, w3, …wt;然后再顺序访问...未访问连接点为起点,DFS搜索图,直至图中所有与v0路径相通顶点都被访问。...3)若该图为连通图,则图中一定还存在未被访问顶点,选取该顶点为起点,重复上述DFS过程,直至图中全部顶点均被访问过为止。...//递归深度优先遍历DFS void DFS2(int vertex){ stack stack; stack.push(vertex); //当前结点入栈...(DFS)序列为:"<<endl; graph.DFS1(now); cout<<endl; graph.reset(); cout<<"递归深度优先遍历(DFS

    95220

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

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

    70430

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

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

    3.2K00

    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)

    70040

    判断图是否

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

    2.9K80

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

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

    85520

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

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

    9120

    (含DFS、BFS)

    类型 图类型分为很多种,具体如下: 3.1 图 & 无图 3.2 连通图 定义 图中任意顶点都是连通图 具体相关概念 对于图 & 无图,连通图具体概念又不同,具体如下...对于无图: 对于图: 3.3 其余类型图 4....图遍历 数据结构:图文详解二叉树(遍历、类型、操作) 5.1 定义 从图中某1顶点出发,遍历图中其余所有顶点 & 使每1个顶点仅被访问1次 5.2 遍历方式 深度优先遍历(DFS)、广度优先遍历(BFS...) 5.3 具体介绍 5.3.1 深度优先遍历( DFS ) 简介 算法示意图 具体实现:递归 & 递归 此处图存储结构 = 邻接矩阵 import java.util.Stack; public...最小生成树 本节主要讲解 图中 最小生成树 6.1 定义 构造 连通网图 最小成本生成树 网图:带有权值图 最小成本:(n-1)条边将 含n个顶点连通图 连接起来 & 使得权值和最小 6.2

    28530
    领券