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....