Tarjan 系列算法笔记
0 概述
\(\text{Tarjan}\) 的核心思想:\(\text{dfn}\) 序与 \(\text{low}\) 数组
因此, \(\text{Tarjan}\) 的算法框架也是一个标准的 \(\text{dfs}\) 过程
\(\text{Juanzhang}\) 曾说过:
我到现在也没有理解 \(\text{Tarjan}\) 其中一些深奥的东西
希望我自己能够看到 \(\text{Juanzhang}\) 所看到的东西
笔记整理了如下算法:
- 割点与桥
- 点、边双联通分量
- 强联通分量
- 圆方树
1 dfn 与 low
1.1 dfn
\(\text{dfn}\) 数组所记录的是,该图中,在由一个点出发进行的 \(\text{dfs}\) 这个过程中,\(\text{dfn}\) 便为 \(\text{dfs}\) 到每一个点的时间戳 (由 \(1\) 开始)
简单记录下做题中用到的 \(\text{dfn}\) 的性质:
- 在 \(\text{dfs}\) 的过程中,\(\text{dfn}\) 比某一个点的 \(\text{dfn}\) 大的点与该点的子树中的每一个点一一对应 (即可轻松判断是否在子树内)
在我看来,\(\text{dfn}\) 的意义在于,由于性质 \(1\),我们记录的 \(\text{dfn}\) 事实上暗含了一些信息,这些信息有如下作用:
- 给每一个点赋予了独一无二的编号
- 记录了一些关于子树的信息
1.2 low
\(\text{low}[\text{i}]\) 表示对于第 \(\text{i}\) 个节点,在 \(\text{dfs}\) 树上,以它为根的子树,除去它自己的所有节点的相邻节点的 \(\text{dfn}\) 的最小值
简单记录下做题中用到的 \(\text{low}\) 的性质:
- 容易想到,如果是一个树,那么这棵树上的任意一个节点,都有 \(\text{dfn}[\text{i}] = \text{low}[\text{i}]\)
- 但如果随便连一条本来不在树上的边 \((u, v)\)
2 割点与桥
割点的定义:
将该点割去后,即删除这个点和与之相邻的所有边之后,该图联通块数量增加的点称为割点
桥的定义:
将该边删除后,该图联通块数量增加的边称为边