1、简介
tarjan是一种使用深度优先遍历(DFS)来寻找有向图强连通分量的一种算法。

2、知识准备
栈、有向图、强连通分量、DFS。

3、快速理解tarjan算法的运行机制
提到DFS,能想到的是通过栈来储存沿途的点,可以找到所有的环。环本身就是联通的,所以环对于强连通分量来说环已经很接近最终答案了。要把找环变成找强连通管分量还要考虑:
a.在环外是不是有其他环在这个强连通分量内(极大性)

(会被认为是2个环)

b.一些不能构成环的点无法被考虑到,而他们本身就是强连通分量

(2不被认为是一个强连通分量)

所以Tarjan算法除了栈还引入了2个数组,分别是:
DFN[N]//节点的时间戳,用来标记节点访问的先后顺序(以及是否被访问过)
Low[N]//当前“环”里最先被访问到的节点,相当于当前这个强连通分量里的根

Tarjan的流程是:
DFS,每遇到一个未被访问过的节点就初始化DFN[i]=Low[i]=index++;
如果找到了环,就在遍历中用Low数组向上传递根的时间戳,直到找到一个点他的时间戳和根的时间戳一致,即DFN[i]=Low[i],这就说明这个点就是根。此时,栈内的所有在根后面的点(包括根)就组成一个强连通分量。

4、伪代码

index=;
tarjan(u)
{
DFN[u]=low[u]=index++;
u入栈;
for(遍历每条边(u,v))
{
if(v未被访问)
{
tarjan(v);//DFS
low[u]=min(low(u),DFN(v));//将下方的时间戳向上传递
}
else if(v在栈内)
{
low[u]=min(low[u],DFN(v));//找到环,比较当前保存的根的时间戳和v的时间戳,取较早的那个作为根
}
if(DFN(u)==low[u])
{
//回到了根节点,此时栈内从u往后的节点都是该强连通分量的节点
//找到了强连通分量,逐个退栈,输出
}
}
}

5、进一步说明
a.对于问题a,为什么能找到强连通分量内其他的环?
DFS的问题在于,找到了环立即处理而不考虑其他环;Tarjan算法把输出交给根节点处理,在到根节点之前,算法已经遍历的根节点下的所有节点,自然也把所有环放入了栈。
b.对于问题b,为什么考虑到了不能构成环的那些节点?
对于这些节点,DFN(u)==low[u],相当于他们本身就是强连通分量的根节点。

6、延伸阅读
如果您仍然有疑问,可以参考https://blog.csdn.net/qq_34374664/article/details/77488976

寻找图的强连通分量:tarjan算法简单理解的更多相关文章

  1. 求图的强连通分量--tarjan算法

    一:tarjan算法详解 ◦思想: ◦ ◦做一遍DFS,用dfn[i]表示编号为i的节点在DFS过程中的访问序号(也可以叫做开始时间)用low[i]表示i节点DFS过程中i的下方节点所能到达的开始时间 ...

  2. 有向图强连通分量Tarjan算法

    在https://www.byvoid.com/zhs/blog/scc-tarjan中关于Tarjan算法的描述非常好,转述如下: 首先解释几个概念: 有向图强连通分量:在有向图G中,如果两个顶点间 ...

  3. 图之强连通、强连通图、强连通分量 Tarjan算法

    原文地址:https://blog.csdn.net/qq_16234613/article/details/77431043 一.解释 在有向图G中,如果两个顶点间至少存在一条互相可达路径,称两个顶 ...

  4. 图的连通性:有向图强连通分量-Tarjan算法

    参考资料:http://blog.csdn.net/lezg_bkbj/article/details/11538359 上面的资料,把强连通讲的很好很清楚,值得学习. 在一个有向图G中,若两顶点间至 ...

  5. 有向图强连通分量 Tarjan算法

    [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极 ...

  6. [有向图的强连通分量][Tarjan算法]

    https://www.byvoid.com/blog/scc-tarjan 主要思想 Tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一棵子树.搜索时,把当前搜索树中未处理的 ...

  7. 图论-强连通分量-Tarjan算法

    有关概念: 如果图中两个结点可以相互通达,则称两个结点强连通. 如果有向图G的每两个结点都强连通,称G是一个强连通图. 有向图的极大强连通子图(没有被其他强连通子图包含),称为强连通分量.(这个定义在 ...

  8. POJ1236_A - Network of Schools _强连通分量::Tarjan算法

    Time Limit: 1000MS   Memory Limit: 10000K Description A number of schools are connected to a compute ...

  9. 强连通分量——tarjan算法

    概念: 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通.如果有向图G的每两个顶点都强连 ...

随机推荐

  1. UITextField设置leftView的Insets

    Insets就是css中的padding 我们给UITextField设置了leftView,目的是在文本输入框左側显示一个图标.可是在ios7里,这个图标会紧紧地挨着TextField的左边框,非常 ...

  2. JS 实现Map

    function Map() { this.arr = new Array(); var struct = function(key, value) { this.key = key; this.va ...

  3. 分析MySQL各项指标

    MySQL各项指标(因为这不是大多数搜索引擎的区别故意) INDEX(总指数):主要指标,不管是什么限制 ALTER TABLE `table_name` ADD INDEX index_name ( ...

  4. ATS项目更新(1) CC视图与备份路径同步

    1: subst t: /d 2: subst t: D:\PublicViews\Automation_Framework\SQA_ATE_DEV 3: 4: rem ** update folde ...

  5. 实现js呼叫流行

    <span style="font-size:14px;">//Html代码:单击控制实现通话"收件人流行" <!DOCTYPE html&g ...

  6. Nginx之Eclipse开发环境配置

    C开发的IDE很多,为什么使用Eclipse?原因: 1. 历史原因:使用eclipse时间长,比较熟悉. 2. 功能原因:使用eclipse查看源码,可以在各个函数与头文件间直接跳转.这是所谓号称& ...

  7. Nginx支持LInux的软链接或硬链接

    在我们配置nginx的时候,有些时候,大部分都是讲root指向真实的目录.但是有些时候,我们需要指向一个软链接.但是配置的时候,发现会有问题. 我们可以通过以下的方法,来解决,让nginx支持软链接/ ...

  8. ntp时间同步,各种配置方法

    1 Windows xp NTP服务器的配置(2003配置方式一样) 1) 首先需要关闭作为NTP服务器的windows系统自带的防火墙,否则将同步不成功. 2) 单击“开始”,单击“运行”,键入 r ...

  9. 使用Notepad++远程编辑Ubuntu上的源码

    简单搭建了在Windows上远程编辑Ubuntu Server 14.04上面源代码的环境,记录一下,给需要的人. Notepad++安装NppFTP 从插件菜单打开PluginManager,选中N ...

  10. SQL Server Update 所有表的某一列(列名相同,类型相同)数值

    ); WITH T AS (SELECT SchemaName = c.TABLE_SCHEMA, TableName = c.TABLE_NAME, ColumnName = c.COLUMN_NA ...