Tarjan Algorithm
Tarjan 算法常用于求解:
- 有向图中的强连通分量(SCC, Strongly Connected Components);
- 无向图中的割点;
- 无向图中的割边,又称桥。
核心思想是 DFS 时间戳和 low 数组。
1. 核心数组
| 数组 | 含义 |
|---|---|
dfn[u] |
节点 u 第一次被 DFS 访问到的时间戳 |
low[u] |
从 u 或 u 的子树出发,经过树边和返祖边能到达的最小 dfn |
可以直观理解为:
dfn记录“访问顺序”;low记录“最多能往祖先回到哪里”。
2. 有向图强连通分量 SCC
强连通分量指的是有向图中的一个最大点集,其中任意两个点都可以互相到达。
1 |
|
使用时,对每个未访问节点调用:
1 | for (int i = 1; i <= n; ++i) |
3. 无向图割边(桥)
在无向图中,如果删除一条边后,图的连通分量数量增加,则这条边是桥。
对于 DFS 树边 u -> v,如果:
1 | low[v] > dfn[u] |
说明 v 的子树无法通过返祖边回到 u 或 u 的祖先,因此边 (u, v) 是桥。
4. 无向图割点
在无向图中,如果删除某个点后,图的连通分量数量增加,则这个点是割点。
判断规则:
- 如果
u不是 DFS 根节点,并且存在子节点v满足low[v] >= dfn[u],则u是割点。 - 如果
u是 DFS 根节点,并且它有两个及以上 DFS 子树,则u是割点。
5. 记忆重点
| 问题 | 关键判断 |
|---|---|
| SCC 根 | dfn[u] == low[u] |
| 桥 | low[v] > dfn[u] |
| 割点(非根) | low[v] >= dfn[u] |
| 割点(根) | DFS 子树数量 ≥ 2 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Elian's blog page!