板块:图论
难度:较易
前置知识:图的基本概念与性质、有向无环图(DAG)
定义
- 连通分量:对于一个有向图,对于分量中的任意两点 u , v u,v u,v,必然可以从 u u u 走到 v v v,从 v v v 走到 u u u。
- 强连通分量:极大连通分量(简称SCC)
用途
将任意一个有向图转换为有向无环图。如对于下图,我们通过缩点操作将 2、3、6 合并为一点,所谓缩点,就是将一个强联通分量中的所有点都合并为一个点的操作,一个强联通分量内的各点一定可以互相到达。操作的最终结果就是把每个点都放在一个强联通分量中。

演变为下图:

这样做的好处,一方面,在求最短最长路时可以线性地做;另一方面,很多题目在一个任意有向图中难以完成,但放在一个有向无环图中则会变得简单。因此,强连通分量的相关算法在信息学竞赛中发挥着中重要作用。
算法基本原理与过程
基本原理
首先先介绍一些特殊的边,在实际算法实现中不会涉及,但有助于我们理解算法的原理与过程:
- 树枝边:对于 ( x , y ) (x,y) (x,y),若 x x x 是 y y y 的父节点,则 x x x 与 y y y 相连的边称为树枝边。
- 前向边:对于 ( x , y ) (x,y) (x,y),若 x x x 是 y y y 的祖先节点,则 x x x 与 y y y 相连的边称为前向边。树枝边是特殊的前向边。
- 后向边:对于 ( x , y ) (x,y) (x,y),若 y y y 是 x x x 的祖先节点,则 y y y 与 x x x 相连的边称为后向边。
- 横叉边:对于 ( x , y ) (x,y) (x,y),若 x x x 在 y y y 的左侧的其他分支,那么 x x x 与 y y y 相连的边称为横叉边。根据 DFS 序,横叉边只能向左。

我们要把每个节点都放在一个强联通分量中,那么我们首先应该判断它是否已经在一个强联通分量中。总的来说,如果一个节点可以回到某个祖先节点,那么它已经存在在一个SCC中了。具体地,分为以下两种情况:
- 可以沿着路径回到某个祖先节点(即存在一条

本文详细介绍了图论中的强连通分量概念及其重要性,特别是在有向无环图(DAG)转换中的应用。讲解了强连通分量的定义、用途,以及如何通过Tarjan算法求解强连通分量。算法中涉及了时间戳、DFS序、栈等数据结构,并给出了具体的代码实现。最后,通过一个实例展示了强连通分量在解决实际问题中的应用。
最低0.47元/天 解锁文章
4933

被折叠的 条评论
为什么被折叠?



