Trova i cicli semplici in un grafico diretto


15

Questo problema, per me, sembra molto interessante. Stava per trovare un semplice ciclo (cioè un ciclo in cui non si ripetono nodi) in un grafico diretto.

La mia soluzione sta andando in questo modo, cioè questo grafico è un problema di caso: inserisci qui la descrizione dell'immagine

So che c'è un ciclo in un grafico, quando puoi trovare i "bordi posteriori" in una prima ricerca di profondità (tratteggiata nella mia immagine in DFSTree), e per un momento posso essere sicuro per alcuni cicli, ma non per tutti, cicli semplici. Perché, gli egdes diretti sono così importanti da un ciclo, cioè (0123)! = (0321)

Sto pensando di creare un dfs per ogni nodo con i bordi posteriori, ma non ne sono sicuro e non è chiaro. Quindi ti chiedo se mi guidi. Grazie!. inserisci qui la descrizione dell'immagine

Ecco il mio conteggio di semplici loop per il mio problema del caso.

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagineinserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine


Risposte:


13

Questa domanda sembra essere molto googleable. Ad esempio, potresti essere interessato all'algoritmo presentato in questo documento:

Trovare tutti i circuiti elementari di un grafico diretto . Donald B. Johnson. SIAM J. COMPUT. Vol. 4, n. 1, marzo 1975

Astratto.Viene presentato un algoritmo che trova tutti i circuiti elementari di un grafico diretto nel tempo limitato da O((n + e)(c + 1))e spazio limitato da O(n + e), dove ci sono nvertici, ebordi e ccircuiti elementari nel grafico. L'algoritmo ricorda gli algoritmi di Tiernan e Tarjan, ma è più veloce perché considera ogni fronte al massimo due volte tra un circuito e l'altro nella sequenza di uscita.

L'articolo contiene un algoritmo completo.


Ok. La carta è perfetta, ma posso andare in qualsiasi altro momento con il mio lavoro o semplicemente guardare la carta? Ti stavo cercando per presentarmi la soluzione, cosa sto dimenticando con la mia idea?
Jonaprieto,

2
Il tuo problema principale è che l'albero dfs non è univoco (ad esempio, scambia "1" con "3" nel diagramma). Dovresti guardare tutti i possibili alberi dfs per enumerare tutti i cicli.
badroit,

1
Nel caso in cui sia necessaria un'implementazione Java di questo algoritmo: github.com/1123/johnson
user152468

Il link @badroit è interrotto ... :(
Jorge E. Hernández,

@lalongooo, grazie sì, l'ho sostituito.
badroit,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.