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

本文介绍了如何使用深度优先遍历来检测图中是否存在环,通过维护节点的三种状态(未搜索、搜索中、已完成)确保环路的检测。算法流程包括从未搜索节点开始,递归遍历并标记节点状态,遇到已搜索节点则判断是否存在环。
摘要由CSDN通过智能技术生成

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

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

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

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

[未搜索]:全新节点

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值