算法复习——图算法篇之强连通分量
以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习!
1. 问题背景
-
社交圈划分
- 如何把人群按通话记录划分成不同的社交圈?
- 如果闭环通话,说明关系相对密切;如果单向通话,说明关系相对疏远。

-
强连通分量(有向图)
- 一个强连通分量是顶点的子集
- 强连通分量中任意两点相互可达
- 满足最大型:加入新顶点,不保证相互可达
- 特性:任意两强连通分量不相交
- 反证易得,若相交,破坏了最大性

2. 问题定义
强连通分量(Strongly Connected Components)
输入:
- 有向图 G = < V , E > G=<V, E> G=<V,E>
输出:
- 图的所有强连通分量 C 1 , C 2 , … , C n C_1, C_2, \dots, C_n C1,C2,…,Cn

3. 算法框架

步骤1:把边反向,得到反向图 G R G^R GR

步骤2:在 G R G^R GR上执行DFS,得到顶点完成时刻顺序 L L L
例如,得到的 L L L如下所示:

步骤3:在 G G G上按 L L L逆序执行DFS,得到强连通分量
4. 伪代码
Strongly-Connected-Component(G)
输入:图G
输出:强连通分量
R ← {}
G_R ← G.reverse()
L ← DFS(G_R)

本文介绍了一种求解有向图中强连通分量的有效算法,包括算法原理、框架及正确性证明。该算法首先反转图的边,然后进行两次深度优先搜索,能够以O(|V|+|E|)的时间复杂度找到所有强连通分量。

1万+

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



