Si, la DFS va bene come strategia per verificare se ci sono cicli in un grafo. E ti permette di farlo in O(m+n)
Un grafo orientato e aciclico se durante una visita DFS non si incontrano archi all'indietro cioè, se durante la visita del nodo u non si incontra un arco (u,v) tale che v sia un nodo visitato e
appartenga al cammino corrente che va dal nodo iniziale (radice della visita) al nodo u.
codice:
struct structgrafo {
int NODI [ n+1]; // vettore dei nodi
int ARCHI [ m ]; // vettore degli insiemi di adiacenza
boolean VISITATO [ n ]; // vettore dei nodi visitati
boolean CAMMINO [ n ]; // vettore booleano che descrive il cammino corrente
boolean aciclico; // variabile booleana
};
typedef struct structgrafo grafo;
void ACICLICO ( grafo G , nodo u )
{
int i ;
nodo v ;
G -> CAMMINO [u] = TRUE; // u appartiene al cammino corrente
G-> VISITATO [u] = TRUE; // marca u visitato
for ( i = G->NODI [u]; i < G->NODI [u+1]; i++ )
{
v = G->ARCHI [i]; // nodo adiacente
if (! G->VISITATO [v])
ACICLICO (G ,v);
else
if (G->CAMMINO [v] == TRUE)
G->aciclico = FALSE;
}
G->CAMMINO [u] = FALSE; // u NON appartiene al cammino corrente
}