一些概念

连通:无向图中的任意两点都可以互相到达。

强连通:有向图中的任意两点都可以互相到达。

连通分量:无向图的极大连通子图。

强连通分量:有向图的极大强连通子图。


DFS 生成树:对一张图(有向无向均可)进行深度优先遍历得到的生成树。

树边:在 DFS 生成树上的边。

前向边:由子树的根连向子树内的非树边。

返祖边:由结点连向其祖先的边。

横叉边:除上面三种之外的边。

求强连通分量

对于结点 \(u\),记录两个信息 \(dfn_u\) 和 \(low_u\)。

\(dfn\) 表示时间戳,即第几个被遍历到的点。

\(low\) 表示从当前点开始,经过的边的两个端点均未处在已找出的强连通分量中,能到达最小的时间戳。

在 dfs 的过程中,将经过的点塞进一个栈里面。一旦发现 \(dfn_u=low_u\) 就一直弹栈直至弹出结点 \(u\),弹出的这些点就构成了一个强连通分量。

然后考虑如何求出 \(low_u\),枚举 \(u\) 的每条出边 \((u,v)\)。

  • 结点 \(v\) 未遍历过,先递归处理该点,这样 \((u,v)\) 就成了树边,然后 \(low_u\gets\min(low_u,low_v)\)。

  • 结点 \(v\) 已遍历过。

    • 结点 \(v\) 处在一个已找出的强连通分量中,根据定义直接跳过。
    • 结点 \(v\) 未处在已找出的强连通分量中,这样 \((u,v)\) 就成了非树边,同样地,\(low_u\gets\min(low_u,low_v)\)。

\(low\) 数组其实是在找一条向上的路径,而两个强连通分量是不可能有公共点的,所以我们才会有经过边的限制。

但是还有一个问题,\(low\) 数组有时会不能更新完全,怎么办呢?

按照边 \(1\to 2\to 3\to 4\to 5\to 6\) 的顺序走,仔细分析可以发现,\(low_3\) 没有更新完全的原因是 \(low_2\) 没有更新完全,而不是 \(low_3\gets \min(low_3,low_2)\) 导致的。

所以问题出在已遍历过的情况中。

但其实是没有关系的,\(low\) 数组的目的仅仅是判断当前强连通块是否能够继续向上合并。

所以可以在将 \(low_v\) 换成 \(dfn_v\)。

那么算法的正确性就很显然了,在合法的情况下(\(low\) 的定义)尽可能将当前强连通分量扩大

Tarjan 算法总结的更多相关文章

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

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

  2. 点/边 双连通分量---Tarjan算法

    运用Tarjan算法,求解图的点/边双连通分量. 1.点双连通分量[块] 割点可以存在多个块中,每个块包含当前节点u,分量以边的形式输出比较有意义. typedef struct{ //栈结点结构 保 ...

  3. 割点和桥---Tarjan算法

    使用Tarjan算法求解图的割点和桥. 1.割点 主要的算法结构就是DFS,一个点是割点,当且仅当以下两种情况:         (1)该节点是根节点,且有两棵以上的子树;         (2)该节 ...

  4. Tarjan算法---强联通分量

    1.基础知识 在有向图G,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极大强连通子 ...

  5. (转载)LCA问题的Tarjan算法

    转载自:Click Here LCA问题(Lowest Common Ancestors,最近公共祖先问题),是指给定一棵有根树T,给出若干个查询LCA(u, v)(通常查询数量较大),每次求树T中两 ...

  6. 强连通分量的Tarjan算法

    资料参考 Tarjan算法寻找有向图的强连通分量 基于强联通的tarjan算法详解 有向图强连通分量的Tarjan算法 处理SCC(强连通分量问题)的Tarjan算法 强连通分量的三种算法分析 Tar ...

  7. [知识点]Tarjan算法

    // 此博文为迁移而来,写于2015年4月14日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vxnx.html UPD ...

  8. Tarjan 算法&模板

    Tarjan 算法 一.算法简介 Tarjan 算法一种由Robert Tarjan提出的求解有向图强连通分量的算法,它能做到线性时间的复杂度. 我们定义: 如果两个顶点可以相互通达,则称两个顶点强连 ...

  9. 【小白入门向】tarjan算法+codevs1332上白泽慧音 题解报告

    一.[前言]关于tarjan tarjan算法是由Robert Tarjan提出的求解有向图强连通分量的算法. 那么问题来了找蓝翔!(划掉)什么是强连通分量? 我们定义:如果两个顶点互相连通(即存在A ...

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

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

随机推荐

  1. Spring源码分析之`BeanFactoryPostProcessor`调用过程

    前文传送门: Spring源码分析之预启动流程 Spring源码分析之BeanFactory体系结构 本文内容: AbstractApplicationContext#refresh前部分的一点小内容 ...

  2. day77:luffy:导航栏的实现&DjangoRestFramework JWT&多条件登录

    目录 1.导航栏的实现 2.登录前戏:用户表初始化 3.DjangoRestFramework JWT 4.多条件登录 5.登录状态的判断和退出登录 1.导航栏的实现 1.设计导航栏的model模型类 ...

  3. 监控制图OxyPlot组件的下载与安装

    1.在工具(T)-NuGet包管理器(N)-管理解决方案的NuGet程序包(N),打开组件管理界面 2.切换到浏览窗口,安装以下三个窗口组件即可 3.OxyPlot文档手册 https://oxypl ...

  4. 这么设置Intellij IDEA,据说效率还不错~

    显示工具条 (1)效果图 (2)设置方法 标注1:View–>Toolbar 标注2:View–>Tool Buttons 设置鼠标悬浮提示 (1)效果图 (2)设置方法File–> ...

  5. SPOJ16607 IE1 - Sweets

    题面 传送门: 洛咕 SPOJ Solution 这题的想法挺妙的. . 首先,对于这种区间求答案的问题,我们一般都可以通过类似前缀和的思想一减来消去a,即求[a,b]的答案可以转化为求[1,b]-[ ...

  6. Netcore中简单使用MemoryCache

    用到缓存架构,我们一般都会想到的Redis,因为它支持分布式,高可用,速率非常快.MemoryCache则相对较少提到,但是对于单体项目或者小型项目,memorycache还是是不错的选择.Memor ...

  7. MySQL全面瓦解8:查询的正则匹配

    概述 上一章 查询的过滤条件,我们了解了MySQL可以通过 like % 通配符来进行模糊匹配.同样的,它也支持其他正则表达式的匹配,我们在MySQL中使用 REGEXP 操作符来进行正则表达式匹配. ...

  8. windows鼠标右键文件太多

    1.网上找的(已经验证太难找,并没有多大用) 单击Windows的"开始"菜单,单击"运行",在"打开"框中键入"regedit& ...

  9. php支付宝签名验证类

    <?php /* * 黎明互联 * https://www.liminghulian.com/ */ class RSA { /** * RSA签名 * @param $data 待签名数据 * ...

  10. icmp port unreachable

    端口不可达: client------>server 结果server回复端口不可达, 由于是icmp报文: 到达client内核协议栈后进入icmp_rcv处理: /* * Deal with ...