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,CA→BB→CA→CA, 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.