有向图的强连通分量(Strongly Connected Components)
如果在所有顶点对之间都有一条路径,则有向图是强连通的。有向图的强连通分量是最大的强连通子图。
例如,下图中有3个SCC。
算法分析
我们可以使用Kosaraju算法在 O(V+E) 时间内找到所有强连通组件。
以下是Kosaraju的详细算法:
1)创建一个空堆栈 “S”,并对一个图G执行DFS遍历。在DFS遍历中,对顶点的相邻顶点调用递归DFS后,将顶点推到堆栈。在上图中,如果我们从顶点0开始DFS搜索算法,我们得到堆栈中的顶点为1、2、4、3、0。
2)反方向所有边,得到图1的反向图。
3)当S不为空时,逐个从S弹出一个顶点。让弹出的顶点为“v”。以V为源,执行DFS( 调用dfsUtil(v) )。从v开始使用DFS算法打印 v 的强连通组件。
在上面的示例中,我们按顺序 0、3、4、2、1(从堆栈中逐个弹出)处理顶点。
算法设计
package com.bean.algorithm.graph;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Stack;
public class StronglyConnectedComponents