一些概念

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

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

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

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


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. 输出5个大写英文字母的组合,并写入到txt文档中,随机数法。

    1.问题起源:最近想申请几个英文商标,研究了一下,英文字母在4到7个之间最好,5个字母尤佳,所以先来输出5个字母的组合,可是想像力有限,于是想用排列组合把所有5个可能的字母组合都输出,再从中挑选几个感 ...

  2. 01 . Go语言的SSH远程终端及WebSocket

    Crypto/ssh简介 使用 下载 go get "github.com/mitchellh/go-homedir" go get "golang.org/x/cryp ...

  3. GitHub 上适合新手的开源项目(Python 篇)

    作者:HelloGitHub-卤蛋 随着 Python 语言的流行,越来越多的人加入到了 Python 的大家庭中.为什么这么多人学 Python ?我要喊出那句话了:"人生苦短,我用 Py ...

  4. MapReduce在Shuffle阶段按Mapper输出的Value进行排序

    ZKe ----------------- 在MapReduce框架中,Mapper的输出在Shuffle阶段,根据Key值分组之后,还将会根据Key值进行排序,因此Reducer的输出我们看到的结果 ...

  5. c#写入文件流

    using (FileStream wir=new FileStream(@"C:\Documents and Settings\Administrator\桌面\1.txt",F ...

  6. WSL-Ubuntu18.04 磁盘迁移 与 ns3-gym 安装

    WSL 安装 win10 版本应大于或等于 1903 win10 设置页面 输入 控制面板 并点击进入 找到 程序和功能 并打开 找到 启动或关闭 Windows 功能 并打开 向下拉 勾选 适用于L ...

  7. 内网渗透 day9-免杀基础

    免杀1 目录 1. 会话提升的几种方式 1 2. armitage的熟悉 2 3. handler生成监听器的方法 6 4. 防止会话假死 6 5. 控制台设置编码 7 6. upx加壳 7 7. m ...

  8. javascript函数式编程基础随笔

    JavaScript 作为一种典型的多范式编程语言,这两年随着React\vue的火热,函数式编程的概念也开始流行起来,lodashJS.folktale等多种开源库都使用了函数式的特性. 一.认识函 ...

  9. kernel——Makefile, head.S ...

    在Makefile中找到的重要信息: (1)连接脚本 通过连接脚本,知道的信息: (1)入口符号 stext (2)入口连接地址 0xC0000000 + 0x00008000 根据入口符号,可以找到 ...

  10. yum 的一些问题总结

    1. yum 只删除目标,不删除依赖 rpm -e --nodeps xxx 2.yum remove 出错 报错 Error: Cannot retrieve repository metadata ...