Ecco lo pseudocodice:

codice:
procedura visitaFortementeConnesse(){
    numeroDFS=contatore
    contatore++
    fuga(v)=numeroDFS(v)
    for each (arco(v,w) in G)do
        if(u non ancora in T) then
            aggiungi (v, w) a T
            P.push(w)
            visitaFortementeConnesse(w, P)
            fuga(v)= min{fuga(v), fuga(w)}
        else
            fuga(v)=min{fuga(v), numeroDFS(w)}
    if(fuga(v) = numeroDFS(v)) then
        do                                            {stampa tutti i vertici della componente [v]}
            u=p.pop()
            stampa il vertice u
            elimina u e tutti gli archi incidenti su u
        while(u!=v)
}

algoritmo fortementeConnesse( grafo G){
    contatore =1;
    Pila p;
    crea un nuovo vertice x con archi (x,v) per tutti i vertici v
    T<-- albero contenente un solo vertice x
    visitaFortementeConnesse(x,p)
}
Elenco alcune definizioni:

numeroDFS(v) è il numero di vertici visitati prima di v
fuga(v) è il vertice con il più piccolo numeroDFS raggiungibile con un arco uscente dal sottoalbero di radice v

Non è detto che da un vertice è possibile raggiungere tutti gli altri vertici del grafo, quindi si deve aggiungere un nuovo vertice connesso a tutti gli altri vertici.

Si deve fare una visita DFS del grafo per trovare la testa di una componente fortemente connessa, quindi v è la testa se numeroDFS(v)=fuga(v). Il contatore può essere implementato tramite una variabile static, in modo tale da conservare il valore per il giusto assegnamento del numero DFS; La pila mi sembra superflua, a voi la parola....