Al hacer un DFS, cualquier nodo se encuentra en uno de los tres estados: antes de ser visitado, durante la visita recursiva a sus descendientes y después de que todos sus descendientes hayan sido visitados (regresando a su padre, es decir, la fase de cierre). Los tres colores corresponden a cada uno de los tres estados. Una de las razones para mencionar los colores y el momento de la visita y el regreso es hacer explícitamente estas distinciones para una mejor comprensión.
Por supuesto, hay usos reales de estos colores. Considere un grafo dirigido . Suponga que desea verificar G para la existencia de ciclos. En un gráfico no dirigido, si el nodo en consideración tiene un vecino negro o gris, indica un ciclo (y el DFS no lo visita como usted menciona). Sin embargo, en el caso de un gráfico dirigido , un vecino negro no significa un ciclo. Por ejemplo, considere un gráfico con 3 vértices - A , B , y C , con bordes dirigidos como A → B , B → C , A → C . Supongamos que el DFS comienza en AsolsolA , B ,CA → BB → CA → CUN, A continuación, visitas , luego C . Cuando ha regresado a A , verifica que C ya haya sido visitado y que esté negro. Pero no hay ciclo en el gráfico.siCUNC
En un gráfico dirigido, un ciclo está presente si y solo si se vuelve a ver un nodo antes de que todos sus descendientes hayan sido visitados. En otras palabras, si un nodo tiene un vecino que es gris, entonces hay un ciclo (y no cuando el vecino es negro). Un nodo gris significa que actualmente estamos explorando sus descendientes, y si uno de esos descendientes tiene una ventaja sobre este nodo gris, entonces hay un ciclo. Por lo tanto, para la detección de ciclos en gráficos dirigidos, debe tener 3 colores. También podría haber otros ejemplos, pero debes hacerte una idea.
Es un ejercicio en CLRS que puede eliminar el color gris o negro y el algoritmo funciona bien con solo dos colores, en otras palabras, no es realmente necesario. El objetivo principal de marcar vértices es asegurarse de que no nos encontremos con un bucle infinito visitando repetidamente vértices ya visitados.
La razón para usar 3 colores en el algoritmo DFS es principalmente pedagógica: es más clara desde el punto de vista conceptual, ayuda a los estudiantes a ver qué sucede durante la ejecución de cada nodo.
fuente
El vértice gris indica que ha visitado ese nodo y se ha movido a uno de sus vecinos en algún orden, pero puede haber más vértices vecinos a ese nodo. Si bien puede ser útil al retroceder para explorar vértices no visitados.
Digamos El vértice A tiene dos vecinos B y C y B tiene un vecino D .
comienza en el vértice A, que es de color blanco y lo hace gris y atraviesa a su vecino.
Digamos que al elegir el orden alfabético, visita el vértice B que está en color blanco y marca como gris.
Luego visita D de blanco -> gris D -> no más vecinos. por lo tanto marca D-> negro .
Ahora, retrocede a B en Gray y no más nieghbors. De ahí las marcas B-> negro .
Una vez más retrocede A en gris y visita la marca c en c-> Gris, no más vecinos marca C como negro
finalmente, vuelve a A y marca el vértice A como negro ya que no hay más vértices blancos y todo como negro.
fuente
En DFS clasificamos las aristas como arista hacia adelante, arista posterior, arista cruzada y arista.
Usamos 3 colores para clasificar los bordes. y estos colores representan el estado del vértice, es decir, v. blanco: el vértice v aún no se ha descubierto.
gris: v ya se ha descubierto, pero todavía no se han descubierto todos los vértices a los que se puede acceder desde v. entonces el vértice v todavía está en la pila.
black: v ya está fuera de stack.discovered y terminado.
Al hacer el DFS si encuentra un vértice gris a través del borde e, entonces es un borde posterior. Si encuentra un vértice negro a través del borde e, entonces es un borde transversal / borde delantero. Si encuentra un vértice blanco, llamará a DFS de forma recursiva.
fuente