tarjan算法介绍与分析

2024-05-04 06:38
文章标签 算法 分析 介绍 tarjan

本文主要是介绍tarjan算法介绍与分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  tarjan算法是一个求取有向图的所有强连通分量的算法,它是以算法提出者Robert Tarjan的名字来命名的。提出此算法的Robert Tarjan是普林斯顿大学的教授,同时他也是1986年的图灵奖获得者(图灵奖是计算机领域的最高荣誉,和物理、化学领域的诺贝尔奖是一个层次的奖项)。
  在详细讲述该算法之前,我们需要明确几个概念(注意该算法的研究对象是有向图,无向图没有强连通等概念)。
1. 强连通
  如果两个顶点可以互相通达,则称这两个顶点强连通。
2. 强连通图
  如果有向图G中的任意两个顶点都是强连通的,那么我们称该有向图G是强连通图。
3. 强连通分量
  非强连通图的极大强连通子图称为强连通分量。
  例如Graph 1就是一个强连通图,Graph 2 不是强连通图,因为4节点不存在到1、2和3的路径。
        强连通图非强连通图
  
  下面介绍该算法的处理流程:
1. 首先定义两个数组dfn和low,其中dfn用于记录dfs(深度优先搜索)时,当前节点u的访问时间戳,这里用计数器实现。low用于记录以当前节点u作为根节点能达到的最短时间戳,因为如果出现回边,此时的low值就可能会变小。
2. 初始化时,令节点u的dfn和low值为当前的时间戳count。
3. 如果当前节点u有相连的节点v,此时分为以下几种处理情况。
  - v节点未访问过,此时直接递归处理v。递归返回时low[u]=min{low[u],low[v]}。
  - v节点已访问过且v已和其它节点构成了一个连通分量,即v不在栈中,此时(u,v)为横叉边,不做任何处理。
  - v节点已访问过且v在栈中,此时(u,v)是回边,low[u]=min{low[u],dfn[v]}。注意v节点由于仍在栈中,所以其low[v]的最终值还不确定,当然low[v]总是小于等于dfn[v]的,因此二者都行。
4. 当u节点的所有连接边处理完毕时,low[u]的值也就确定了。此时比较dfn[u]和low[u]的值,若二者相同,则说明栈中从该节点往上的所有节点构成一个强连通分量,将其弹出即可。要理解这个判定规则的原理,需要明确dfn和low的定义,这里dfn[u]表示节点u第一次访问时的时间戳,low[u]是u的子节点能达到的最小时间戳,若u无子节点,则low[u]等于dfn[u],即u节点自身构成一个强连通分量。
5. 需要注意的是当我们处理完一个强连通分量时,有可能需要改变搜索的起点,因此我们可以在外围添加一个循环,若某个节点未访问过,则调用1-4步骤进行处理。
  
  以下是该算法的伪代码描述。

tarjan(u) 
{dfn[u]=low[u]=++count               // 为节点u设定时间戳dfn和low初值stack.push(u)                       // 将节点u压入栈中for each (u, v) in E                // 枚举u的每一条出边if (v is not visited)           // 如果节点v未被访问过tarjan(v)                   // 递归向下处理low[u] = min(low[u], low[v])else if (v in S)                // 如果节点v还在栈内low[u] = min(low[u], dfn[v])if (dfn[u] == low[u])               // 如果节点u是强连通分量的根repeatv = stack.pop               // 将v出

这篇关于tarjan算法介绍与分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

Python实现NLP的完整流程介绍

《Python实现NLP的完整流程介绍》这篇文章主要为大家详细介绍了Python实现NLP的完整流程,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 编程安装和导入必要的库2. 文本数据准备3. 文本预处理3.1 小写化3.2 分词(Tokenizatio

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

Spring中Bean有关NullPointerException异常的原因分析

《Spring中Bean有关NullPointerException异常的原因分析》在Spring中使用@Autowired注解注入的bean不能在静态上下文中访问,否则会导致NullPointerE... 目录Spring中Bean有关NullPointerException异常的原因问题描述解决方案总结