Tarjan算法详解
Tarjan算法详解
今天偶然发现了这个算法,看了好久,终于明白了一些表层的知识、、、、在这里和大家分享一下。。。
Tarjan算法是一个求解极大强联通子图的算法,相信这些东西大家都在网络上百度过了,这里不再赘述。
在这个算法中,定义了两个数组,一个是dfn数组,一个是low数组,相信大家在这里就晕了(我也晕了、、),不过自己模拟了几次算法执行过程之后,就理解了这个算法的意思,如果大家不明白,也可以这样做
我觉得突破点主要在dfn数组和low数组的含义该如何诠释:
dfn数组: 意思就是在dfs的过程中,当前的这个节点是第几个被访问的
low数组: 有些并查集的意思,就是在dfs的过程中,标记如果当前节点是极大强联通子图的话,他的根节点的标号就是对应的low值:
如果下一个要遍历的节点在栈中,那么就要把当前节点的low值设置成 下一个节点(在栈中)的dfn值,dfn值是什么呢?就是记录这个节点是第几个被遍历到的。
如果下一个要遍历的节点不再栈中,那么就要把当前节点的low值设置成下一个节点和当前节点的low值中最小的那个。
如果还是不太明白,仔细看两遍把、、、、要不然还可以看看下面的模拟过程吧:
(1)假如从1号节点开始遍历,开始dfs,并不断设置当前节点的dfn值和low值,并压入栈中,那么第一次在6处停止,因为6没有出度。那么此时的dfn和low值分别为:(初始化所有的low和dfn为0)
节点: 1 2 3 4 5 6
dfn: 1 0 2 0 3 4
low: 1 0 2 0 3 4
栈: 1 3 5 6
(2)6号节点没有能出边了,那么6号节点自己就成为一个极大强联通子图,弹出6,对5来说,6被访问过了,所以它也没有能访问的边了,那么5 也是一个极大强联通子图,弹出5
(3)现在模拟指针在3的位置,3遍历到4,四再遍历1号节点,因为1号节点还在栈中,那么就代表着栈中的现有的所有元素构成了一个强联通图(仔细想想、、),而且4号节点访问到了1号节点,那么就把low[4]的值设置为1号节点的根吧(low[1])那么现在的low[4] = 1(代表着4的根节点是1),再接着访问4的下一个子节点,6号节点,而6已经被访问过了,所以退出循环,退到3号节点处,3号节点也没有能访问的下一个节点了,退回到1号节点处。
(4)现在访问1号节点的下一个能访问的节点,2号节点,然后再访问4号节点,因为4号节点现在在栈中,那么还是像刚才一样,把二号节点的low值设置成4号节点的根(low[4]),现在,退回到1,遍历结束。
现在栈中有元素1,3,4,2,剩下的就是极大强联通子图了。。。
网上有许多详解Tarjan算法的例子,如果刚才我描述的还是看不懂,可以参见http://wenku.baidu.com/view/112c64096c85ec3a87c2c527.html?re=view
Tarjan算法详解的更多相关文章
- Tarjan 算法详解
一个神奇的算法,求最大连通分量用O(n)的时间复杂度,真实令人不可思议. 废话少说,先上题目 题目描述: 给出一个有向图G,求G连通分量的个数和最大连通分量. 输入: n,m,表示G有n个点,m条边 ...
- Tarjan算法详解理解集合
[功能] Tarjan算法的用途之一是,求一个有向图G=(V,E)里极大强连通分量.强连通分量是指有向图G里顶点间能互相到达的子图.而如果一个强连通分量已经没有被其它强通分量完全包含的话,那么这个强连 ...
- ACM(图论)——tarjan算法详解
---恢复内容开始--- tarjan算法介绍: 一种由Robert Tarjan提出的求解有向图强连通分量的线性时间的算法.通过变形,其亦可以求解无向图问题 桥: 割点: 连通分量: 适用问题: 求 ...
- Tarjan算法 详解+心得
Tarjan算法是由Robert Tarjan(罗伯特·塔扬,不知有几位大神读对过这个名字) 发明的求有向图中强连通分量的算法. 预备知识:有向图,强连通. 有向图:由有向边的构成的图.需要注意的是这 ...
- BM算法 Boyer-Moore高质量实现代码详解与算法详解
Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...
- kmp算法详解
转自:http://blog.csdn.net/ddupd/article/details/19899263 KMP算法详解 KMP算法简介: KMP算法是一种高效的字符串匹配算法,关于字符串匹配最简 ...
- 机器学习经典算法详解及Python实现--基于SMO的SVM分类器
原文:http://blog.csdn.net/suipingsp/article/details/41645779 支持向量机基本上是最好的有监督学习算法,因其英文名为support vector ...
- [转] KMP算法详解
转载自:http://www.matrix67.com/blog/archives/115 KMP算法详解 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段. 我们这里说的K ...
- 【转】AC算法详解
原文转自:http://blog.csdn.net/joylnwang/article/details/6793192 AC算法是Alfred V.Aho(<编译原理>(龙书)的作者),和 ...
随机推荐
- linux时间校准设置,解决与本地时间不一致问题
时间安装脚本 从NTP上把时间同步到本地 cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 更新本地时间 ntpdate us.pool.nt ...
- HttpClient的使用-爬虫学习1
HttpClient的使用-爬虫学习(一) Apache真是伟大,为我们提供了HttpClient.jar,这个HttpClient是客户端的http通信实现库,这个类库的作用是接受和发送http报文 ...
- 5 MySQL索引
目录: 1. 索引概述 1.1 为什么引入索引 1.2 什么是索引 1.3 索引的好处 1.4 索引的不足 1.5 索引分类 2. 索引设计原则 3. 索引建立和删除 3.1 索引创建 3.2 索引删 ...
- web 安全知识
目录 背景最简单的 Web 物理架构攻击方式总览Web 软件安全攻击防护浏览器安全攻击Cookie 假冒隐藏变量修改跨站脚本攻击服务器安全攻击缓冲区溢出认证逃避非法输入授权逃避SQL 注入异常敏感信息 ...
- [转]OPENSOLARIS 2009.06 REPOSITORY ISO IMAGES NOW AVAILABLE
Source: http://hosam.wordpress.com/2009/07/25/opensolaris-2009-06-repository-iso-images-now-availabl ...
- [转]Apple iPod, iPhone (2g, 3g), iPad Dock connector pinout
Pin Signal Description Apple pin numbering* 1 GND Ground (-), internally connected with Pin 2 on iPo ...
- 图解JS的传值与传址
//编程过程中经常会碰到传值,传址的问题!今天的主题就是关于传值.与传址. //先讲讲赋值操作 //下例是原始类型赋值操作 var a=1,b=a,a=2; console.log("a=& ...
- C# 号码归属地查询算法(根据Android来电归属地二进制文件查询修改)
前言 近期有个项目需要用到号码归属查询,归属地数据库可能比不上ip138,淘宝上也有卖的-,-! 文本提供一个279188条记录并压缩成562KB的归属地数据.我在互联网上搜索了相关文章,要不是数据库 ...
- 基于Redis的CustomerSessionProvider(一)
CustomerSessionProvider需要实现SessionStateStoreProviderBase 在设计Redis Session Provider的时候,需要考虑 1.是否每个用户的 ...
- Hibernate之AbstractEntityPersister
Hibernate开发中需要根据持久层对象获取所映射的数据库表相关信息,如表名,主键,外键对象等相关系. Hibernate配置 Hibernate.cfg.xml <?xml version= ...