Migliore risposta
Un componente fortemente connesso (SCC) in un grafo diretto è un ciclo o un singolo vertice.
Applichiamo DFS al grafico e teniamo traccia di due proprietà per ogni nodo nella struttura ad albero DFS prodotta: 1. Il suo tempo (o ordine) della prima scoperta in DFS. ( diciamo p1) 2. Lordine del più antico antenato che può raggiungere. (diciamo p2) Inizialmente entrambi sono uguali per ogni nodo. Mentre la prima proprietà rimane costante, la seconda può essere aggiornata durante le chiamate DFS ricorsive e utilizzata per trovare i margini di ritorno agli antenati. Per ogni vertice se entrambi sono uguali dopo chiamate DFS ricorsive a tutti i suoi vertici adiacenti, allora è uno o laltro 1. Un singolo vertice che non fa parte di alcun ciclo. OPPURE 2. Parte di un ciclo e quindi tutti i suoi discendenti (nellalbero DFS prodotto) possono raggiungerlo (non possono raggiungere i suoi antenati). In altre parole, possiamo iniziare e finire in questo nodo. Nel secondo caso possiamo tenere traccia di tutti i discendenti da stampare.
questa animazione aiuta a capire la spiegazione (il primo intero è p1, il secondo è p2):
@ File: Tarjan “s Algorithm Animation.gif
Spiegazione dettagliata e implementazione c ++: Tarjan” s Algoritmo per trovare componenti fortemente connessi – GeeksforGeeks
PS: questo algoritmo è molto simile alla ricerca di punti di articolazione, ponti e grafici bicolori. Quindi impararli prima può aiutarti a ottenere una migliore intuizione per lalgoritmo. http://www.geeksforgeeks.org/articulation-points-or-cut-vertices-in-a-graph/ http://www.geeksforgeeks.org/bridge-in-a-graph/
Risposta
Lalgoritmo accetta un grafo diretto come input e produce una partizione dei vertici del grafo nelle componenti fortemente connesse del grafo. Ogni vertice del grafico appare esattamente in una delle componenti fortemente connesse. Qualsiasi vertice che non si trova su un ciclo diretto forma di per sé una componente fortemente connessa: per esempio, un vertice il cui grado in o out è 0, o qualsiasi vertice di un grafo aciclico.
Lidea di base dellalgoritmo è questa: una ricerca in profondità inizia da un nodo iniziale arbitrario (e le successive ricerche in profondità vengono condotte su tutti i nodi che non sono stati ancora trovati). Come al solito con la ricerca in profondità, la ricerca visita ogni nodo del grafico esattamente una volta, rifiutando di rivisitare qualsiasi nodo che sia già stato esplorato. Pertanto, la raccolta di alberi di ricerca è una foresta estesa del grafico. I componenti fortemente connessi verranno ripristinati come alcuni sottoalberi di questa foresta. Le radici di questi sottoalberi sono chiamate “radici” dei componenti fortemente connessi. Qualsiasi nodo di un componente fortemente connesso potrebbe fungere da root, se capita di essere il primo nodo del componente scoperto dalla ricerca.