Lo scopo del nodo grigio nella ricerca della profondità del grafico


18

In molte implementazioni della prima ricerca di profondità che ho visto (ad esempio: qui ), il codice distingue tra un vertice grigio (scoperto, ma non tutti i suoi vicini sono stati visitati) e un vertice nero (scoperto e tutti i suoi vicini sono stati visitati) . Qual è lo scopo di questa distinzione? Sembra che l'algoritmo DFS non visiterà mai un vertice visitato indipendentemente dal fatto che sia grigio o nero.

Risposte:


25

Quando si esegue un DFS, qualsiasi nodo si trova in uno dei tre stati - prima di essere visitato, durante la visita ricorsiva dei suoi discendenti, e dopo che tutti i suoi discendenti sono stati visitati (tornando al suo genitore, cioè alla fase di conclusione). I tre colori corrispondono a ciascuno dei tre stati. Uno dei motivi per menzionare i colori e il tempo di visita e di ritorno è quello di fare esplicitamente queste distinzioni per una migliore comprensione.

Naturalmente, ci sono usi reali di questi colori. Si consideri un grafo orientato . Supponiamo di voler controllare G per l'esistenza di cicli. In un grafico non indirizzato, se il nodo in esame ha un vicino nero o grigio, indica un ciclo (e il DFS non lo visita come menzionato). Tuttavia, nel caso di un grafico diretto , un vicino nero non significa un ciclo. Ad esempio, si consideri un grafico con 3 vertici - A , B , e C , con archi orientati come A B , B C , A C . Supponiamo che il DFS inizi da AGGA,B,CABBCACA, Poi le visite , poi C . Quando è tornato ad A , controlla che C sia già stato visitato ed è nero. Ma non c'è ciclo nel grafico.BCAC

In un grafico diretto, è presente un ciclo se e solo se un nodo viene visto di nuovo prima che tutti i suoi discendenti siano stati visitati. In altre parole, se un nodo ha un vicino che è grigio, allora c'è un ciclo (e non quando il vicino è nero). Un nodo grigio significa che attualmente stiamo esplorando i suoi discendenti - e se uno di questi discendenti ha un vantaggio su questo nodo grigio, allora c'è un ciclo. Pertanto, per il rilevamento del ciclo nei grafici diretti, è necessario disporre di 3 colori. Potrebbero esserci anche altri esempi, ma dovresti avere l'idea.


2
+1 buona spiegazione. Per un semplice attraversamento di tutti i nodi in un grafico non orientato (come quello collegato nel mio corpo di domanda), GRIGIO e NERO non hanno alcuna differenza funzionale?
user6805

1
@ user6805 Per l'attraversamento semplice - visitando ogni nodo - sia del grafico diretto che non indirizzato, non vi è alcuna differenza funzionale tra grigio e nero. Puoi usare solo due colori (o visitati / non visitati). È per gli algoritmi più complessi che sono necessari i colori.
Paresh,

Ho capito! OK, considera il seguente caso: twitter.com/MaksimADmitriev/status/796995958043279361 Attraversiamo i grafici usando DFS. Il grafico a sinistra è uguale al grafico di questa risposta e non ha cicli. Attraversiamo il grafico a destra che ha un ciclo. Visitiamo A e lo contrassegniamo in grigio. Visitiamo B e lo contrassegniamo in grigio. Visitiamo C e lo contrassegniamo in grigio. Ora stiamo per visitare A che è già grigia. Quindi "dal nero al nero" non significa che esiste un ciclo, ma "dal grigio al grigio". Ecco perché abbiamo bisogno del grigio. Per favore, correggimi se sbaglio
Maksim Dmitriev,

Per scopi ancora più complessi come la ricerca di componenti fortemente connessi, potrebbe essere necessario registrare due volte per ciascun nodo: pre-tempo in cui un nodo viene trovato per la prima volta (ovvero, il tempo è colorato in grigio) e post-tempo quando un nodo viene visitato (vale a dire, il tempo è di colore nero). Per implementare le registrazioni, viene mantenuto un contatore, che aumenta ogni volta che si verifica un evento.
Giovanni

2

È un esercizio in CLRS che puoi rimuovere il colore grigio o nero e l'algoritmo funziona bene con solo due colori, in altre parole non è davvero necessario. L'obiettivo principale di contrassegnare i vertici è assicurarsi che non ci imbattiamo in un ciclo infinito visitando ripetutamente vertici già visitati.

La ragione per usare 3 colori nell'algoritmo DFS è principalmente pedagogica: è concettualmente più chiara, aiuta gli studenti a vedere cosa succede durante l'esecuzione per ciascun nodo.


0

Il vertice grigio afferma che hai visitato quel nodo e sei passato a uno dei suoi vicini in un certo ordine, ma potrebbero esserci più vertici vicini a quel nodo. Può essere utile durante il backtracking per esplorare vertici non visitati.

Diciamo Vertex A ha due vicini B e C e B ha un vicino D .

iniziare dal vertice A che è di colore bianco e renderlo grigio e attraversare il suo vicino.

Diciamo che scegliendo l'ordine alfabetico visita il vertice B che è di colore bianco e contrassegna come grigio.

Quindi visita D di bianco -> grigio D -> non più vicini. quindi segna D-> nero .

Ora, torna indietro a B in grigio e non più nieghbors. Quindi segna B-> nero .

Ritorna di nuovo A in grigio e visita il segno c in c-> Grigio, nessun altro vicino segna C come nero

infine, torna ad A e segna il vertice A come nero in quanto non ci sono più vertici bianchi e tutti come nero.


Non vedo se la distinzione tra grigio e nero ha uno scopo qui ...
user6805

questo è quello che devi capire. Se un vertice è contrassegnato come nero, significa che non ci sarebbero vertici vicini a quel vertice. Qui il vertice D è marcato in nero perché non ci sono vertici vicini .. dove il grigio suggerisce che ci sono più vicini da visitare e quindi li attraversi.
NRK,

Credo che ti salvi semplicemente dalla rivisitazione dei nodi che conosci per certo non hanno bordi posteriori (es. Ottimizzazione)
Setheron,

0

In DFS classifichiamo i bordi come avanti, indietro, incrociati e alberati.

Usiamo 3 colori per classificare i bordi. e questi colori rappresentano lo stato del vertice, cioè v. bianco: il vertice v non è ancora stato scoperto.

grigio: v è già stato scoperto, ma tutti i vertici che sono raggiungibili da v non sono ancora stati scoperti. quindi il vertice v è ancora nello stack.

nero: v è già fuori dallo stack, scoperto e finito.

Nel fare il DFS se si incontra un vertice grigio attraverso il bordo e, allora è un bordo posteriore. Se incontri un vertice nero attraverso il bordo e, allora è un bordo trasversale / bordo anteriore. se incontri il vertice bianco, chiamerai DFS in modo ricorsivo.


OK ma qual è il punto? Hai detto che il bianco / grigio / nero è legato a avanti / indietro / croce / albero, ma non dici nemmeno a cosa servano quelle cose. Quindi ora ci sono sette cose che il richiedente non capisce, invece di solo tre!
David Richerby,

Questi bordi possono essere utilizzati in varie applicazioni di DFS, come i bordi posteriori vengono utilizzati per identificare i loop in un grafico, i bordi Forward e Cross vengono utilizzati per verificare se esiste un percorso univoco tra ogni coppia di vertici.
Neeraj Singh,
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.