首页 > 其他分享 >深度优先遍历判断有向图环路

深度优先遍历判断有向图环路

时间:2024-04-09 21:35:16浏览次数:12  
标签:环路 优先 遍历 有向图 搜索 深度 节点 分支

本质上,就是通过深度优先来完成所有边的遍历,一旦有环必然会被发现。

深度优先遍历这个大家已经很熟悉了,我们需要做的是在每次增加深度时,记下从起点到当前节点所经过的所有节点,一旦重复访问了已经访问过的节点,就必然是有环的。

那么我们就需要用一个数组来记录已经访问过的节点。

又因为路径中的分叉,所以在记录访问状态的时候,必须要考虑到节点复用的问题,即一个节点有多个分叉的问题。节点应该有三个状态才能满足这些要求,即:

[未搜索]:全新节点

[搜索中]:我们搜索过这个节点,但是该节点的所有分支和子分支并没有搜索完

[已完成]:该节点的分支和子分支已经全部搜索完毕,没有环路

到这里,我们的算法也很明显了:

  1. 任取一个[未搜索]的节点x开始深度优先搜索,并将该节点标记为[搜索中]
  2. 遍历该节点x的每一个相邻节点y
    • 如果y 是[未搜索]节点,那么从y结点开始深度优先搜索;
    • 如果y是[搜索中]节点,那么代表图中有一个环
    • 如果y是[已完成]节点,那么代表该节点的分支及子分支已经确认是无环了,不用进行操作;
  3. x的所有节点都是[已完成]时,则代表着该图是无环的;

标签:环路,优先,遍历,有向图,搜索,深度,节点,分支
From: https://www.cnblogs.com/bloodcolding/p/18124869

相关文章

  • 【题解 | 二叉树】给定二叉树的后序遍历和中序遍历,求层序遍历结果
    树的遍历给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。输入格式:输入第一行给出一个正整数N(≤......
  • 顺序表的建立与遍历
    读入n值及n个整数,建立顺序表并遍历输出。输入格式:读入n及n个整数输出格式:输出n个整数,以空格分隔(最后一个数的后面没有空格)。首先定义顺序表这个结构体点击查看代码typedefstructsqList{intarrayList[maxSize];intarrayLength;}需要初始化一个顺序表点......
  • java 对List<Map<String, Object>>遍历
    在Java中,遍历List<Map<String,Object>>可以通过多种方式来实现。以下是一些常见的方法:使用for-each循环javaList<Map<String,Object>>list=//初始化你的Listfor(Map<String,Object>map:list){for(Map.Entry<String,Object>entry:map.entrySet()){......
  • java 对Map<String, Object>遍历
    在Java中,你可以使用多种方法来遍历Map<String,Object>。以下是一些常见的方法:使用Map.Entry和IteratorjavaMap<String,Object>map=newHashMap<>();//添加一些键值对到map中Iterator<Map.Entry<String,Object>>iterator=map.entrySet().iterator();while(iterator.ha......
  • 【题解】洛谷马的遍历
    马的遍历方法:广度优先搜索源代码如下#include<iostream>#include<queue>#include<cstdio>#include<cstring>usingnamespacestd;structcoord{//结构体定义x,y坐标intx,y;};queue<coord>Q;intans[500][500];//-1代表未访问intwalk[8......
  • C++ 遍历queue
    在C++中,std::queue是一个遵循先进先出(FIFO)原则的容器。由于std::queue不提供直接访问容器内部元素的方法,因此不能直接遍历。但是,您可以使用一个临时队列来遍历。以下是如何做到这一点的示例代码: #include<iostream>#include<queue>intmain(){std::queue<i......
  • 动态规划和层次遍历 —— [NOIP2002 普及组] 过河卒
    题目如下:[NOIP2002普及组]过河卒题目描述棋盘上AAA点有一个过河卒,需要走到目标BB......
  • Oracle 递归遍历
    1、场景递归到第几层,例如递归到第2层   selectlevel,--层级wdj.*fromwip_discrete_jobs_vwdjwhere1=1startwithwdj.wip_entity_name='08363790'--递归开始connectbywdj.attribute3=priorwdj.wip_entity_nameandlevel<3; 2、一行数据出现两......
  • Elasticsearch,使用scroll实现遍历(分页)查询
    为什么要使用scroll查询在使用es中,当某个index存贮的数据超过10000时,只能查询到10000的数据。因为index.max_result_window默认值是10000。并且使用游标查询可以在一次查询中获取大量文档,并且保持查询快照状态,允许用户多次检索数据而不影响其他并发请求。scroll查......
  • 二叉树的非递归遍历
    感谢b站up主优雅的代码:https://space.bilibili.com/95715842二叉树的非递归遍历非递归的先序遍历思想:利用栈先进后出的性质。将根节点入栈,(根节点出栈的同时先拉右子树入栈,之后拉左子树入栈;左子树出栈的同时先拉其右子树入栈);依次继续。voidpreOrder(TreeNode*root){......