基本定义:
图G(V,E)中,在深度搜索时为每一个节点记录两个时间戳,分别是开始扫描的时间d和将其所有子节点全部扫描完的时间f;
定义d(U)为节点集U中d的最小值,定义f(U)为节点集U中f的最大值。
基本步骤:
1.对图G进行深度优先搜索,记录每个节点的d,f;
2.求图G的转置Gt(所有节点不变,边的方向变反);
3.按照步骤一所求的节点的f,按照降序,对Gt进行深度优先搜索,得到的深度优先森林,森林中深度为1所形成的每个树,即为各个强连通分量
具体代码:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Scanner;
/**
*
* @author Founder
* 通过深度优先搜索,查找强连通分量
*/
public class Main{
static int time = 0; //时间戳
static ArrayList<Integer> topology; //记录第一次搜索结果的拓扑排序
public static void main(String[] args){
/**
* 输入方式:
* 第一行输入节点的个数n
* 后面n行输入第n个节点(从0开始数)链接的子节点,没有子节点则直接换行
*/
Scanner input = new Scanner(System.in);
int n = input.nextInt();
Node[] nodes = new Node[n];
topology = new ArrayList<>();
for(int i = 0; i < n; ++i){
nodes[i] = new Node();
}
input.nextLine();
for(int i = 0; i < n; ++i){
String line = input.nextLine();
if(!line.equals("")){