Algoritmo para hallar componentes fuertemente conexas(SCC) en grafos dirigidos.
SE DEBEN LIMPIAR LAS ESTRUCTURAS DE DATOS ANTES DE UTILIZARSE

int v, e; 
static int n = 5000; // Máxima cantidad de nodos
static int dfs_low[] = new int[n];
static int dfs_num[] = new int[n];
static boolean marked[] = new boolean[n];
static Stack<Integer> s;
static int dfsCont, cantSCC;
static ArrayList<Integer> ady[] = new ArrayList[n];
	
public static void main (String[] args){
    for( int i = 0; i < v; i++ ){ //Por si el grafo no es conexo
        if( dfs_num[i] == -1 ){
            dfsCont = 0;
            s = new Stack<Integer>();
            tarjanSCC(i);
        }
    }
}
	
public static void tarjanSCC( int u ){
	dfs_low[u] = dfs_num[u] = dfsCont;
	dfsCont++;
	s.push(u);
	marked[u] = true;
		
	int j, v;
		
	for( j = 0; j < ady[u].size(); j++ ){
		v = ady[u].get( j );
			
		if( dfs_num[v] == -1 ){
			tarjanSCC( v );
		}
			
		if( marked[v] ){
			dfs_low[u] = Math.min( dfs_low[u], dfs_low[v] );
		}
	}
		
	if( dfs_low[u] == dfs_num[u] ){
		cantSCC++;
        /* ********************************************************* */
        /* Esta seccion se usa para imprimir las componentes conexas */
		System.out.println("COMPONENTE CONEXA #" + cantSCC );
		while( !s.empty() ){
			v = s.peek();
			s.pop();
			marked[v] = false;
			System.out.println(v);
			if( u == v ) break;
		}
        /* ********************************************************** */
	}
		
}



@@ -140,18 +140,21 @@
 SE%0A%0A
-int v, e; 
+static int v;
 %0Asta
@@ -423,255 +423,8 @@
 ;%0A%09%0A
-public static void main (String%5B%5D args)%7B%0A    for( int i = 0; i %3C v; i++ )%7B //Por si el grafo no es conexo%0A        if( dfs_num%5Bi%5D == -1 )%7B%0A            dfsCont = 0;%0A            s = new Stack%3CInteger%3E();%0A            tarjanSCC(i);%0A        %7D%0A    %7D%0A%7D%0A%09%0A
 publ
@@ -536,17 +536,16 @@
  = true;
-%0A
 %09%09%0A%09int 
@@ -549,17 +549,16 @@
 nt j, v;
-%0A
 %09%09%0A%09for(
@@ -801,80 +801,9 @@
 C++;
-%0A        /* ********************************************************* */
+%09
 %0A   
@@ -823,16 +823,26 @@
 seccion 
+comentada 
 se usa p
@@ -880,19 +880,24 @@
 nexas */
+%09%09
 %0A%09%09
+/* 
 System.o
@@ -1072,88 +1072,525 @@
 %0A%09%09%7D
-%0A        /* ********************************************************** */%0A%09%7D%0A%09%09
+ */%0A%09%7D%0A%7D%0A%0A%09%0Apublic static void main (String%5B%5D args)%7B%0A%09%0A%09 for (int i = 0; i %3Cn; i++) %7B //inicializa las estructuras necesarias para la ejecucion del algoritmo.%0A                ady%5Bi%5D = new ArrayList%3CInteger%3E();%0A                dfs_low%5Bi%5D = 0;%0A                dfs_num%5Bi%5D = -1;%0A%09%09 marked%5Bi%5D = false;%0A            %7D%0A%09%0A    %09for( int i = 0; i %3C v; i++ )%7B //Por si el grafo no es conexo%0A        if( dfs_num%5Bi%5D == -1 )%7B%0A            dfsCont = 0;%0A            s = new Stack%3CInteger%3E();%0A            tarjanSCC(i);%0A        %7D%0A    %7D
 %0A%7D%0A%0A%0A
+%0A

Update Tarjan.java