【算法概论】图论算法:有向图中环的判断问题

2024-03-10 01:38

本文主要是介绍【算法概论】图论算法:有向图中环的判断问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题描述:

       给定一个有向图,要求使用深度优先搜索策略,判断图中是否存在环。

算法分析❗:

       判断图中是否存在环,要涉及到图的拓扑排序。回看数据结构的书?,上面是这样写的:

       基于环性质,在对有向图进行深度优先搜索?中,可以检查图中是否存在环,并进行拓扑排序。为检测图中是否存在反向边,可使用类似二叉树后序遍历的思想。即,在深度优先搜索中,对当前被访问的任一顶点 v 做访问标记,但不立即输出,而是将输出推迟到它的所有可达顶点(后继顶点)被输出之后。为了保证输出的顶点序列具有拓扑顺序,输出时应将顶点 v 插在它的所有后继顶点之前。这样,在深度优先搜索过程中每个顶点有 未被访问、已访问、已输出 三种状态。对任一顶点 v ,初始状态为 未被访问。当一个顶点被访问后,其状态由 未被访问 变为 已访问,接着检查它的每一个邻接点的状态。若某个邻接点的状态为 已访问,则表明图中有环。

       1、关于邻接表表示法中的拓扑排序问题,在【数据结构】图 - 邻接表表示法 这篇中,已经复习过。

       2、同时,在上述一段话中,还提到了DFS时顶点的三种状态:

       vis 标记 一个顶点的访问情况。

       vis = 0,表示该顶点没没有被访问;
       vis = 1,表示该顶点已经被访问,但其子孙后代还没被访问完 —— 还没从该点返回;
       vis = 2,表示该顶点已经被访问,其子孙后代也已经访问完 —— 已经从该顶点返回。

       3、上面一段话提到一个概念 —— 反向边,❀ 这就跟上课的内容有点联系啦 ?

       上课时,有几个概念:树边、前向边、回边、横跨边,从定义可以看出,这几个概念是图进行DFS时才有的概念。

       进行概念阐述时,让我们与顶点的三种状态结合起来。

       DFS过程中,对于一条边 u → v,

       vis[v] = 0,v 是 首次发现,边 u → v是树边;

       vis[v] = 1,说明 v 已经被访问,但其子孙后代还没有被访问完(正在访问中),而 u 又指向 v,说明 u 就是 v 的子孙后代,

这篇关于【算法概论】图论算法:有向图中环的判断问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/792594

相关文章

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

SysMain服务可以关吗? 解决SysMain服务导致的高CPU使用率问题

《SysMain服务可以关吗?解决SysMain服务导致的高CPU使用率问题》SysMain服务是超级预读取,该服务会记录您打开应用程序的模式,并预先将它们加载到内存中以节省时间,但它可能占用大量... 在使用电脑的过程中,CPU使用率居高不下是许多用户都遇到过的问题,其中名为SysMain的服务往往是罪魁

MySQ中出现幻读问题的解决过程

《MySQ中出现幻读问题的解决过程》文章解析MySQLInnoDB通过MVCC与间隙锁机制在可重复读隔离级别下解决幻读,确保事务一致性,同时指出性能影响及乐观锁等替代方案,帮助开发者优化数据库应用... 目录一、幻读的准确定义与核心特征幻读 vs 不可重复读二、mysql隔离级别深度解析各隔离级别的实现差异

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基