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算法详解的更多相关文章

  1. Tarjan 算法详解

    一个神奇的算法,求最大连通分量用O(n)的时间复杂度,真实令人不可思议. 废话少说,先上题目 题目描述: 给出一个有向图G,求G连通分量的个数和最大连通分量. 输入: n,m,表示G有n个点,m条边 ...

  2. Tarjan算法详解理解集合

    [功能] Tarjan算法的用途之一是,求一个有向图G=(V,E)里极大强连通分量.强连通分量是指有向图G里顶点间能互相到达的子图.而如果一个强连通分量已经没有被其它强通分量完全包含的话,那么这个强连 ...

  3. ACM(图论)——tarjan算法详解

    ---恢复内容开始--- tarjan算法介绍: 一种由Robert Tarjan提出的求解有向图强连通分量的线性时间的算法.通过变形,其亦可以求解无向图问题 桥: 割点: 连通分量: 适用问题: 求 ...

  4. Tarjan算法 详解+心得

    Tarjan算法是由Robert Tarjan(罗伯特·塔扬,不知有几位大神读对过这个名字) 发明的求有向图中强连通分量的算法. 预备知识:有向图,强连通. 有向图:由有向边的构成的图.需要注意的是这 ...

  5. BM算法  Boyer-Moore高质量实现代码详解与算法详解

    Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...

  6. kmp算法详解

    转自:http://blog.csdn.net/ddupd/article/details/19899263 KMP算法详解 KMP算法简介: KMP算法是一种高效的字符串匹配算法,关于字符串匹配最简 ...

  7. 机器学习经典算法详解及Python实现--基于SMO的SVM分类器

    原文:http://blog.csdn.net/suipingsp/article/details/41645779 支持向量机基本上是最好的有监督学习算法,因其英文名为support vector  ...

  8. [转] KMP算法详解

    转载自:http://www.matrix67.com/blog/archives/115 KMP算法详解 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段.    我们这里说的K ...

  9. 【转】AC算法详解

    原文转自:http://blog.csdn.net/joylnwang/article/details/6793192 AC算法是Alfred V.Aho(<编译原理>(龙书)的作者),和 ...

随机推荐

  1. Winform系列

    小菜学习编程-Winform系列(初学者)   前言 记得上次写<小菜的程序员道路(二)>,这篇文章的时候说过,要把工作以来整理的编程知识分享给大家,因为这半年来的工作实在是忙,现在也在忙 ...

  2. Excel报表开发(主要讲Excel的导入和导出)

    一.Excel数据导入 连接字符串Excel2003版: OleDbConnection conn = new OleDbConnection("provider=Microsoft.Jet ...

  3. SQL Server跨网段(跨机房)FTP复制

    SQL Server跨网段(跨机房)FTP复制 2013-09-24 17:53 by 听风吹雨, 273 阅读, 0 评论, 收藏, 编辑 一. 背景 搭建SQL Server复制的时候,如果网络环 ...

  4. cocos2dx android运行Luac编译后的lua代码

    环境: win7 64 cocos2d-2.1rc0-x-2.1.2 lua 5.1 通常我们编写好的lua代码都是明文形式,谁都可以查看修改,为了防止自己的劳动成果不被别人轻易的盗取,可以使用lua ...

  5. EasyUI Editable Tree

    效果如图: Create Tree <ul id="tt"></ul> $('#tt').etree({ url: 'tree_data.json', cr ...

  6. zookeeper学习(上)

    zookeeper学习(上) 在前面的文章里我多次提到zookeeper对于分布式系统开发的重要性,因此对zookeeper的学习是非常必要的.本篇博文主要是讲解zookeeper的安装和zookee ...

  7. Jquery EasyUI tabs处理

    一 获取选中的 Tab 1.   // 获取选中的 tab panel 和它的 tab 对象 2.  var pp = $('#tt').tabs('getSelected'); 3.  var ta ...

  8. TOGAF架构内容框架之架构制品(下)

    TOGAF架构内容框架之架构制品(下) 4.2.31 数据生命周期图(Data Lifecycle Diagram) 数据生命周期图是在业务流程的约束之下对业务数据在其整个生命周期(从概念阶段到最终退 ...

  9. [置顶] github 出现 Permission denied (publickey)的解决

    今天写了一篇博客,想push到github上的时候出现了以下错误 Permission denied (publickey). fatal: The remote end hung up unexpe ...

  10. 使用HttpURLConnection实现多线程下载

    HttpURLConnection继承了URLConnection,因此也可用于向指定网站发送GET请求.POST请求,而且它在URLConnection基础上提供了如下便捷方法: 实现多线程下载的步 ...