对于无向图G: 如果两个顶点之间有一条路径连着, 我们就说这两个顶点是连通的(无向图的边无方向性, 只要有边连着就是连通的)。 如果满足图中的任意两个顶点都是连通的, 我们就说图是连通图。 所谓的连通分量, 就是无向图中的极大连通子图。 对于连通图, 只有一个连通分量, 就是它本身。 非联通的无向图有多个连通分量。
如下图, 该无向图的连通分量分别是: (A L M J B F C), (D E), (G, K, H, I)。
当对无向图进行遍历的时候, 如果该无向图是连通图, 只需从图的任一个顶点出发, 进行DFS(或者BFS), 便可以遍历图中所有的顶点。 对于非连通的无向图, 则需要从多个顶点出发进行搜索。 而每一次从一个新的起始点出发进行搜索得到的顶点访问序列恰为各个连通分量的顶点集合。 不难看出,对无向图进行的DFS调用的次数(指的是选择新的起始点进行DFS)就是给定无向图的连通分量的个数。
对于有向图, 对应的概念强连通分量。
若对于V中任意两个不同的顶点u和v,都存在从u到v以及从v到u的路径(注意有向图的边是有方向的),则称G是强连通图(Strongly Connected Graph)。相应地有强连通分量(Strongly Connected Component)的概念。强连通图只有一个强连通分量,即是其自身;非强连通的有向图有多个强连通分量。
寻找有向图的强连通分量的算法用到了图G = (V, E)的转置。 所谓的转置就是把有向图的边进行均做反向处理。
假如图G使用的是邻接链表表示的, 那么求取G的转置图像transpose(G)所需的时间就是线性时间O(V + E)。
下面伪代码, 通过使用两次深度优先搜索计算有向图G的强连通分量(一次对原始图进行DFS, 记录下结束访问的时间。 最后再对 原始图的转置 按照结束访问节点的时间的递减顺序进行一次DFS):