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. ValueStack和OGNL达到Struts2形式的数据存储原理

    (1)最近学习struts相框,我们在快乐struts强大.为了便于使用转发,但不了解详细的内部数据存储: (2)网上找了很多关于struts数据存储的原理,但我还没有找到一个具体的解释,本书上找到了 ...

  2. python3 操作注册表

    1.1 读取 import winreg key = winreg.OpenKey(winreg.HKEY_CURRENT_USER,r"Software\Microsoft\Windows ...

  3. UVA 10641 - Barisal Stadium(DP + 几何)

    题目链接:10641 - Barisal Stadium 题意:逆时针给定n个点,在给m个灯,每一个灯有一个花费,要求最小花费使得全部边能被灯照到 思路:用向量叉积推断向量的顺逆时针关系,从而预处理出 ...

  4. 使用 install.packages() 安装所需的包

    1. 从 CRAN 上安装 install.packages("tm", dependencies = TRUE) tm 程序包用于文本挖掘(text mining) 2. 本地安 ...

  5. Java 阅读TXT文件

    public class GenCategoryAttrItemHandler { private final static String INPUT_FILE_PATH = "input/ ...

  6. WPF 4 Ribbon 开发 之 应用程序菜单(Application Menu)

    原文:WPF 4 Ribbon 开发 之 应用程序菜单(Application Menu)      在上一篇中我们完成了快捷工具栏的开发,本篇将讲解应用程序菜单开发的相关内容.如下图所示,点击程序窗 ...

  7. WPF生命周期

    App.xaml.cs         重写OnStartup方法,完成初始化 wpf中Window的生命周期    

  8. sql count(1)不要和查询数据混用 非常耗时

    count(1)不要和查询数据混用 非常耗时 例子: SELECT w.[PKID], COUNT(1) OVER() AS TotalCount FROM w WITH(NOLOCK) INNER ...

  9. 在 win10 环境下,设置自己写的 程序 开机自动 启动的方法

    原文:在 win10 环境下,设置自己写的 程序 开机自动 启动的方法 1.是登录自己用户时才能开机启 C:\Users\username\AppData\Roaming\Microsoft\Wind ...

  10. 详解 Java 8 HashMap 实现原理

    HashMap 是 Java 开发过程中常用的工具类之一,也是面试过程中常问的内容,此篇文件通过作者自己的理解和网上众多资料对其进行一个解析.作者本地的 JDK 版本为 64 位的 1.8.0_171 ...