Innanzitutto, eseguire un DFS sul grafico, partendo dal nodo di origine, che, come dici, è noto in anticipo. Se incontri un bordo posteriore [1], allora hai un ciclo e puoi uscire con un errore.Durante questa traversata puoi identificare se ci sono nodi, non raggiungibili dalla sorgente [2] e prendere l'azione appropriata.
Una volta determinato il grafico è un DAG, è possibile garantire che ogni nodo giace su un percorso dalla sorgente al lavandino da un altro DFS, partendo dalla fonte, come segue:
bool have_path(source, sink) {
if source == sink {
source.flag = true
return true
}
// traverse all successor nodes of `source`
for dst in succ(source) {
if not dst.flag and not have_path(dst, sink)
return false // exit as soon as we find a node with no path to `sink`
}
source.flag = true;
return true
}
L' la procedura have_path
imposta un booleano flag
in ciascun nodo, per il quale esiste un percorso da quel nodo al sink. Nello stesso tempo la procedura attraversa solo i nodi raggiungibili dalla sorgente e attraversa tutti i nodi raggiungibili dalla sorgente. Se la procedura restituisce true, allora tutti i nodi, raggiungibili dalla sorgente, giacciono su un percorso verso il sink. I nodi non raggiungibili erano già gestiti nella prima fase.
[1] un bordo, che collega un nodo con un numero maggiore DFS a un nodo con un numero DFS minore, che non è già completamente trasformato, cioè è ancora sul DFS impilare
[2 ] per esempio non avrebbero un numero DFS assegnato
Trova i componenti fortemente connessi. Quindi hai il CC sorgente e affondare CC. Controlla se entrambi contengono solo un elemento. Anche la complessità è lineare. –
In realtà, l'algoritmo di Tarjan non è quello che trova una componente fortemente connessa? –